JSPerf の誰かが、ISO カレンダーの閏年をチェックするための驚くほど高速な実装を落としました (リンク:奇数ビット操作):
function isLeapYear(year) {
return !(year & 3 || year & 15 && !(year % 25));
}
Node.js を使用して、私が知っている他の 2 つのワンライナー実装と比較して簡単に確認しました。
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)
);
}
期待どおりに機能しますが、私の問題は方法がわからないことです。((a % b) == (a & (b-1))
b が 2 の累乗 so(year % 4) == (year & 3)
であることはわかっていyear & 15 && !(year % 25)
ますが、把握するのは非常に困難です。誰かがそれがどのように機能するか説明できますか? この実装に関する参照はありますか?