测试奇数

时间:2013-04-12 13:37:42

标签: javascript modulo bitwise-and

最常见的是,模运算符%用于测试偶数或奇数。

现在我的问题是,是否有任何使用按位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)

2 个答案:

答案 0 :(得分:7)

在JavaScript中,使用任何按位运算符会导致数字首先被截断为32位整数。这意味着它不适用于某些较大的值。 (嗯,相当多的大值: - )

%运算符不会这样做。

编辑 - 嘿,所有对你赞不绝口的好朋友:抱马:-) C5H8NNaO4指出整数截断过程应该保留低位,这样可以直观感觉如果你考虑只是删掉尾数的顶部,实际上一些粗略的“测试”表明它似乎工作正常。

当然,对于真正的大值,事情变得更加复杂,当以不精确的浮点表示时,可能是奇数或偶数,因为缺少最低有效数字。换句话说,当浮点值中的二进制指数导致有效值大于尾数容量(我认为53位)时,您要么必须考虑所有这些数字(因为低位始终为零)否则你必须考虑不确定的问题。

应该很清楚,我不是数学家。

答案 1 :(得分:0)

如果你的数字总是很好地转换为32位int,那么它看起来像Bitwise可以更快 - 我猜一些javascript引擎可以将它JIT到硬件按位操作。我构建了一个jsperf来测试它:

http://jsperf.com/evenness

我在Firefox 20上获得了非常多变的结果,有时Bitwise略快,有时快很多倍。

如果您的数字可能会或可能不会很好地转换为32位整数,那么坚持使用模数。