Javascript 使用位运算符进行闰年检查(惊人的速度)

Javascript 使用位运算符进行闰年检查(惊人的速度),javascript,node.js,leap-year,Javascript,Node.js,Leap Year,JSPerf上有人放弃了一个速度惊人的实现,用于检查ISO日历的闰年(链接:): 使用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)

JSPerf上有人放弃了一个速度惊人的实现,用于检查ISO日历的闰年(链接:):

使用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)
    );
}
函数isLeapClassic(y){return(y%4==0)&&!(y%100==0)| |(y%400==0)}
函数isLeapXOR(y){return(y%4==0)^(y%100==0)^(y%400==0);}
函数是按位(y){return!(y&3 | | y&15&&!(y%25))}
//小范围快速脏测试!
//也适用于负整数

对于(var i=1900;i如果一个数字可以被16整除,也可以被25整除,那么它可以被25(100)整除四次,也可以被25(400)整除16次。

year&3
year%4
是一样的。这里没有那么复杂,它只是代表了通常的4年周期

年份&15
年份%16
相同

因此,如果一年没有被4平均分割,或者如果一年没有被16平均分割,而是被25平均分割,那么它就不是闰年。这意味着25的每一个倍数都不是闰年,除非它也是16的倍数。因为16和25没有任何共同的因素,只有当一年是16*2的倍数时,这两个条件才能得到满足5年或400年。4*25的倍数将被视为非闰年,即100年周期


1900年不是闰年,因为它可以被100整除;2000年是闰年,因为它可以被400整除;2100年不是闰年。

那么,400整除是如何检查的呢?只是出于好奇:优化的具体用途是什么?惊人的速度!如果你打算(re)的话,这很有趣当然,写一个图书馆!我决不会牺牲一个纳秒的性能增益。如果你有数十亿的记录和性能问题,你应该考虑使用一种不同的语言。我写了一个详细的答案。请看你的详细解释,让我把这个算法应用到我的逐日代码中。(基本上,除非我完全理解,否则我不会在解决方案中使用代码)。感谢和+1提供的详细信息:)
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)
    );
}