最常见的是,模运算符%
用于测试偶数或奇数。
现在我的问题是,是否有任何使用按位AND测试奇数的问题,因为感觉更自然地测试最右边的位是1
还是0
而不是模数检查反对2
因为32位转换不会改变最右边的位。
两个
(1 + Math.pow(2,52)) & 1 //1
和
(1 + Math.pow(2,52)) % 2 //1
产生相同的结果。
是否有理由优先使用模运算符而非按位?
编辑:
此问题仅考虑了64位精度范围内的值
因为只有偶数才能在2 ^ 53之上精确表示,因此两个操作数都会失败(9007199254740993 % 2 //0)
答案 0 :(得分:7)
在JavaScript中,使用任何按位运算符会导致数字首先被截断为32位整数。这意味着它不适用于某些较大的值。 (嗯,相当多的大值: - )
%
运算符不会这样做。
编辑 - 嘿,所有对你赞不绝口的好朋友:抱马:-) C5H8NNaO4指出整数截断过程应该保留低位,这样可以直观感觉如果你考虑只是删掉尾数的顶部,实际上一些粗略的“测试”表明它似乎工作正常。
当然,对于真正的大值,事情变得更加复杂,当以不精确的浮点表示时,可能是奇数或偶数,因为缺少最低有效数字。换句话说,当浮点值中的二进制指数导致有效值大于尾数容量(我认为53位)时,您要么必须考虑所有这些数字(因为低位始终为零)否则你必须考虑不确定的问题。
应该很清楚,我不是数学家。
答案 1 :(得分:0)
如果你的数字总是很好地转换为32位int,那么它看起来像Bitwise可以更快 - 我猜一些javascript引擎可以将它JIT到硬件按位操作。我构建了一个jsperf来测试它:
我在Firefox 20上获得了非常多变的结果,有时Bitwise略快,有时快很多倍。
如果您的数字可能会或可能不会很好地转换为32位整数,那么坚持使用模数。