下面的算法:
function isLeapYear(year) {
return !(year & 3 || year & 15 && !(year % 25));
}
是以,這個邏輯是怎麼樣的?
這事我看一段老代碼看到的,實在不了解其中的思路,請指教。
回答
能被4整除但不能被100整除,或能被400整除的年份即為閏年
這是普通寫法:
(year % 4 == 0 && year % 100 != 0) || year % 400 ==0
而year & 3和year % 4一緻, year & 15與year % 16一緻
如果年份不均勻地除以4,或者如果它不均勻分布,則不是16,但是除以25均勻。這意味着25的每個倍數不是閏年,除非它也是16的倍數。由于16和25沒有任何公共因子,是以滿足兩個條件的唯一時間是當年是16 * 25或400年的倍數
// https://en.wikipedia.org/wiki/Leap_year#Algorithm
253 bool leapyear(int y)
254 {
255 if (y % 4 != 0)
256 return false;
257 else if (y % 100 != 0)
258 return true;
259 else if (y % 400 != 0)
260 return false;
261 return true;
262 }