요일 계산, 컴파일러보다 빠른 3-명령어 마법

A faster way to calculate the day of the week

요일 계산, 컴파일러보다 빠른 3-명령어 마법

rata-die(일수)를 요일로 변환하는 것은 단순해 보이지만, 실제로는 복잡한 문제입니다. 이 글에서는 다양한 플랫폼과 용도에 맞춰 조정된 초고속 함수들을 소개합니다. 특히, 곱셈 한 번과 몇 사이클만으로 작동하는 함수들이 기존 솔루션을 능가합니다. 놀라운 결과로, ISO 형식([1‥7])의 요일도 동일한 명령어로 상수만 바꿔 계산할 수 있습니다. 제시된 기법은 x % (2^N - 1)로 일반화되며, x % 24나 x % 60과 같은 다른 나눗셈에도 적용 가능합니다.

이 함수는 전체 signed 32-bit 범위에서 정확하며, x86에서 가장 높은 처리량을 제공합니다.
  1. walrus01

    약간 관련된 주제로, 최근에 개인 및 업무 생활에서 하나의 달력(서양 그레고리력)만 신경 쓰면 된다는 것이 얼마나 단순한 일인지 생각하고 있었습니다. 역사적으로 페르시아어를 사용하는 세계의 많은 지역에서 교육받은 기술/전문직 생활을 하는, 약간이라도 독실한 무슬림이라면, 추적해야 할 달력이 세 개나 있습니다:

    1) 서양 그레고리력 (외국인과의 사업, 국제 여행, 은행, 금융, 인터넷에서 이루어지는 거의 모든 일 등).

    2) 이슬람 아랍 기원의 음력 (라마단이 언제 시작되는지, 하지에 가기에 적절한 시기가 언제인지, 이드 알피트르가 언제인지, 이드 알아드하가 언제인지 등). 이 달력은 서양 그레고리력에 비해 매년 10~11일씩 "뒤로" 가므로, 수십 년에 걸쳐 라마단이 한여름 또는 한겨울에 올 수 있습니다.

    3) 페르시아 태양력은 노루즈(Nowruz)와 같은 새해 기념 및 일반적으로 페르시아 관련 문화적 사항을 위한 것입니다: https://en.wikipedia.org/wiki/Nowruz , https://en.wikipedia.org/wiki/Solar_Hijri_calendar

    하지만 잠깐, 더 있습니다! 우즈베키스탄이나 타지키스탄 또는 그 지역에 살면서 러시아인과 사업을 한다고 가정해 봅시다. 러시아인들이 동방 정교회 달력에 따른 휴일과 종교 의식을 지키기 때문에 휴가 중이고 기업이 문을 닫는 시기를 고려해야 할 수도 있습니다. 기본적으로 영국에서 영국 표준 "은행 휴일"에 사업을 처리하려는 것과 같은 문제입니다. 그들의 크리스마스는 서양과 같지 않습니다 […]

  2. rmunn

    훌륭한 기사이고, 프로그래밍에 매우 유용합니다. 머릿속으로 요일을 계산하는 데는 다른 (그리고 매우 유용한) 트릭이 있습니다. 그것은 일 수 대신 그레고리력의 월과 일을 사용합니다. 왜냐하면 99%의 경우에 당신이 원하는 것이 그렇기 때문입니다: "2026년 8월 31일은 무슨 요일일까?"

    트릭은 어떤 해(윤년이든 아니든)에서든 다음 날짜들이 항상 같은 요일이 된다는 것을 알아차리는 것입니다: 4/4, 6/6, 8/8, 10/10, 12/12. (미국에서 선호하는 월/일 스타일을 사용하든, 나머지 세계가 사용하는 일/월 스타일을 사용하든, 두 경우 모두 그 날짜들은 동일하므로 편리합니다). 그 날짜들이 무슨 요일인지는 해마다 다릅니다: 올해(2026)는 모두 토요일이고, 작년에는 모두 금요일이었으며, 내년에는 모두 일요일이 될 것입니다. 그러나 어떤 해에서든 그 날짜들은 63일(7의 배수)만큼 떨어져 있으므로 항상 같은 요일이 됩니다.

    그리고 그것이 전부가 아닙니다: 5/9, 9/5, 7/11, 11/7을 보십시오 – 그것들도 같은 요일입니다! (다시 말하지만, 편리하게도 이것은 미국식 달력 스타일을 사용하든 나머지 세계의 방식을 사용하든 작동합니다). 그 홀수 날짜들은 "7-11에서 9-to-5 직업"이라는 니모닉 문구로 쉽게 기억할 수 있습니다. 그리고 짜잔, 12개월 중 9개월의 "특별한" 날 하나를 외운 것입니다. (1월, 2월, 3월에 대해 무엇을 하는지는 나중에 다루겠습니다).

    이제 잠시 멈추고 이것이 왜 유용한지 설명하겠습니다. 여러분 중 많은 분들이 이미 […]

  3. userbinator

    이것이 성능에 중요한 계산인 응용 프로그램을 쉽게 떠올릴 수 없어서, 크기를 최적화하는 쪽으로 기울고 싶지만, 더 일반적인 의미에서 "7로 나눈 나머지를 빠르게 구하는 방법"이라는 점에서 이것은 훨씬 더 실용적인 용도가 됩니다.

  4. balgg

    제 댓글은 내용 자체에 관한 것이 아니라... 이것이 제가 웹이 되기를 바라는 모습입니다. 웹에 있는 이점(시각화, 상호작용)을 활용하면서도 구조적이고 단순함을 유지하는 문서. 전반적인 시각적 스타일도 정말 마음에 듭니다. 놀라운 작업입니다. /glaze

  5. gblargg

    페이지에서 다루지 않았지만, 날짜는 에포크로부터 음수 일 수가 될 수 있으며, 이것이 수정(+7)과 mod 7을 두 번 사용하는 이유입니다. 음수 mod 7은 음수를 생성하기 때문입니다.

이 날의 다른 글

2026-08-20