프로그램&회로

윤년 연산테이블..

엠칩 2026. 9. 15. 11:07

코딩하다가 프로그램이 버벅여서보니

윤년 연산하는데 뺑뺑이를 돌려서 부하가 심하게 걸리더군요....

반복연산이 일어나는 부분은 테이블화 시키면 연산속도나 코딩이 많이 간단해집니다. 

//  나눗셈 기반 공식(days_from_civil 등)도 Cortex-M0+(하드웨어 나눗셈 없음)에서는 매번 몇 번씩 비용이 드므로,
//  RTC 연도가 2000~2099(2자리+2000) 범위인 점을 이용해 아예 나눗셈/모듈로 없이 테이블 인덱싱만으로 처리한다.
//  YEAR_START_DAYS[i] = (2000+i)-01-01의 2000-01-01 기준 누적일수. 이 100년 구간엔 100/400 윤년 예외
//  (2100년 등)가 없어 4년마다 정확히 윤년이므로, 윤년 판정도 나눗셈 없이 (yearIndex & 3)==0 비트연산으로 끝난다.
 
static const int32_t YEAR_START_DAYS[100] = {  // 2000~2099
    0,366,731,1096,1461,1827,2192,2557,2922,3288,
    3653,4018,4383,4749,5114,5479,5844,6210,6575,6940,
    7305,7671,8036,8401,8766,9132,9497,9862,10227,10593,
    10958,11323,11688,12054,12419,12784,13149,13515,13880,14245,
    14610,14976,15341,15706,16071,16437,16802,17167,17532,17898,
    18263,18628,18993,19359,19724,20089,20454,20820,21185,21550,
    21915,22281,22646,23011,23376,23742,24107,24472,24837,25203,
    25568,25933,26298,26664,27029,27394,27759,28125,28490,28855,
    29220,29586,29951,30316,30681,31047,31412,31777,32142,32508,
    32873,33238,33603,33969,34334,34699,35064,35430,35795,36160
};

//  [0]=평년, [1]=윤년 : 각 월 1일까지의 누적일수(0-index, 2월 이후에 +1일씩 반영됨)
static const int16_t MONTH_START_DAYS[2][12] = {
    { 0, 31, 59, 90,120,151,181,212,243,273,304,334 },
    { 0, 31, 60, 91,121,152,182,213,244,274,305,335 }
};
 

 

 
static int32_t Main_GetDateSerialMinutes(int16_t year, int16_t month, int16_t day, int16_t hour, int16_t min)
{   int16_t yearIndex = year - 2000;
    int32_t totalDays;

    if(yearIndex < 0)   yearIndex = 0;
    if(yearIndex > 99)  yearIndex = 99;
    if(month < 1)       month = 1;
    if(month > 12)      month = 12;

    totalDays = YEAR_START_DAYS[yearIndex] + MONTH_START_DAYS[(yearIndex & 3) == 0][month - 1] + (day - 1);

    return (totalDays * 1440L) + ((int32_t)hour * 60) + min;
}
 
반응형

'프로그램&회로' 카테고리의 다른 글

KiCad 단축키  (0) 2026.05.20
프로그램 검증 기법의 주요 분류  (0) 2026.04.13
Grok for VScode  (0) 2026.03.26
PCB Current Carrying Capacity  (0) 2026.03.20
전기안전인증 절연 class  (0) 2026.03.06