有人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)
);
}
它按預期工作,但我的問題是我不知道如何。 我知道((a % b) == (a & (b-1))
當b是2的冪時,所以(year % 4) == (year & 3)
,但是year & 15 && !(year % 25)
很難弄清楚。有人能解釋我是如何工作的嗎?有關此實現的任何參考?
只是出於好奇:什麼是用於優化的用例? – user123444555621 2012-03-25 12:34:14
驚人的速度!如果你打算(重新)寫一個當然的圖書館,這很有趣! – Redger 2012-03-25 12:54:31
我永遠不會犧牲納秒性能增益的可讀性。 – user123444555621 2012-03-25 13:17:01