Identifying Leap Years (2020)
davecturner.github.io
davecturner.github.io
As the article mentions, you need a slightly different calculation in the period between 45 BC and 1582 AD -- the rule about 400 didn't exist in the Julian calendar in force then. Before 45 BC, and in non-Roman-based calendars, it gets even more complicated with intercalary months and postponing New Year's and such.
But surely in all but the tiniest fraction of cases, you only care about years after 1582, and years that are no more than a few centuries in the future. There are only 223 leap years from 1582-2500 (I checked with ChatGPT so that number must be right!) A binary search of an ordered 223-item list would require at most 8 comparisons, and if you don't mind a little more space, you could just store all 919 of those years in a list and look up the answer directly. Wouldn't either be faster than any of these methods (and clearer)?
(And if you do need to interpret old dates, consider adding explicit calendar-type annotations to your dates, and especially make sure they align with the calendar(s) your sources are truly using.)
https://godbolt.org/z/xqebM6d11
That code is simple, just divides the argument by a constant. The linked version divides by 32, note the sar eax, 5 instruction, that's the actual division computation. Play around with other constants and you'll get other results (including multiply/shift instruction combinations for non-power of two constants).
16bit: https://gcc.godbolt.org/z/6G38YxcGr
32bit: https://gcc.godbolt.org/z/vEzf9h1jo
I thought it's interesting how "div" is used in 16bit versions, whereas for 32bit versions the compiler optimized all of them to use only imul.