JSPerf上的某人放弃了一种惊人的快速实现,用于检查ISO日历的leap年(链接:奇数位操作):
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)
很难弄清楚。有人可以解释一下它是如何工作的吗?关于此实现的任何参考?
year & 3
与相同year % 4
。那里不是那么棘手,它仅代表通常的4年周期。
year & 15
与相同year % 16
。
因此,它是 不是
闰年,如果一年不均匀4,除非它也是划分,或者如果它不被16整除但25确实匀这意味着,每25多个是不是闰年16的倍数。由于16和25没有任何公因子,所以两个条件都唯一满足的时间是年份是16 * 25的倍数,即400年。4 * 25的倍数将被视为not年,而不是100年的周期。
1900年不是a年,因为它可以被100整除; 2000年 是 a年,因为它可以被400整除,而2100年将不是a年。
问题内容: 为什么按位操作打印-1?在二进制中,不为0应该为1。为什么呢? 问题答案: 你实际上很亲密。 在二进制中,不为0应该为1 是的,当我们谈论一点时,这是绝对正确的。 但是,其值为0实际上是全零的32位!将所有32个零转换为32个零。 这是的补码表示形式。 类似地: 也就是说,对于32位无符号二进制补码表示,。 进一步阅读: 补码 这是Java(以及其他系统)用来表示带符号的数字位的系统
问题内容: …按预期工作,但是如果我需要像这样检查多个字符串怎么办: …似乎不起作用。 问题答案:
问题内容: 我想知道如何实现由位表示的位串的k 循环 右移。 这些代码所做的全部是 返回0 ,如何使其循环移位? 问题答案: 这应该工作: 另请参阅Wikipedia上有关循环移位的文章。
本文向大家介绍JavaScript 按位NOT运算符(〜),包括了JavaScript 按位NOT运算符(〜)的使用技巧和注意事项,需要的朋友参考一下 示例 按位NOT(~)对值中的每个位执行NOT操作。 语法: 返回值: 一个Number。 描述 NOT操作的真值表为: 一种 不是 0 1 1 0 按位不加数字会导致:-(x + 1)。 例子: 值(以10为底) 值(以2为底) 返回(以2为底)
问题内容: 我对何时应该使用布尔运算符与按位运算符感到困惑 与 与 有人能启发我何时使用每种药物,何时使用一种药物会影响我的结果? 问题答案: 以下是一些准则: 布尔运算符通常用于布尔值,而按位运算符通常用于整数值。 布尔运算符是短路,但按位运算符不是短路。 短路行为在这样的表达式中很有用: 按位运算&符将无法正常工作,因为总是会评估双方,即。当你使用布尔运算符时,如果第一个为False,则不计算
问题内容: 当遇到按位移位运算符时,我遇到了一个有趣的场景。如果第二个操作数为负,按位移位运算如何工作?。 即,<< << b,“ <<”将a中的位模式向左移动b位。但是,如果b为负数,在运行时是否应该出错? 我能够成功运行以下代码,但我不知道它是如何工作的? 输入项 结果 “ a”的ASCII码为97。有人可以帮助我了解其工作原理吗? 问题答案: 但是,如果b为负数,在运行时是否应该出错? 不符