【发布时间】:2012-04-08 19:37:57
【问题描述】:
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) 很难弄清楚。有人可以解释一下它是如何工作的吗?关于这个实现的任何参考?
【问题讨论】:
-
只是出于好奇:优化的用例到底是什么?
-
速度惊人!如果您当然打算(重新)编写一个库,那会很有趣!
-
我绝不会为了一纳秒的性能提升而牺牲可读性。
-
如果您有数十亿条记录和性能问题,您应该考虑使用不同的语言。
-
我写了一个详细的答案...见stackoverflow.com/a/11595914/733805
标签: javascript node.js leap-year