JSPerf上有人提供了一个非常快的ISO日历闰年检查实现(链接:Odd bit manipulations):
function isLeapYear(year) {
return !(year & 3 || year & 15 && !(year % 25));
}
使用Node.js,我很快将其与我知道的其他两个一行代码实现进行了比较。
function isLeapClassic(y) { return (y % 4 == 0) && !(y % 100 == 0) || (y % 400 == 0); }
function isLeapXOR(y) { return (y % 4 == 0) ^ (y % 100 == 0) ^ (y % 400 == 0); }
function isLeapBitwise(y) { return !(y & 3 || y & 15 && !(y % 25)); }
//quick'n'dirty test on a small range!
//works with negative integers too
for (var i = 1900; i <= 2100; i++) {
console.log(
"year = %d,\t%d%d%d",
i,
isLeapClassic(i),
isLeapXOR(i),
isLeapBitwise(i)
);
}
它按预期工作,但我的问题是我无法理解如何实现。
我知道当b是2的幂时((a%b)==(a&(b-1))
,所以(year%4)==(year&3)
,但year&15&& !(year%25)
很难理解。有人可以解释一下这是如何实现的吗?有关此实现的任何参考资料?