8

大多数情况下,模运算符%用于测试偶数或奇数。

现在我的问题是,使用按位与对奇数进行测试是否有任何问题,因为它感觉更自然地测试最右边的位是否10进行模检查2

并且作为 32 位转换不改变最右边的位。

两个都

(1 + Math.pow(2,52)) & 1 //1

(1 + Math.pow(2,52)) % 2 //1

产生相同的结果。

是否有理由更喜欢模运算符而不是按位?

编辑:这个问题只考虑在 64 位精度范围内的值,因为只有偶数可以精确表示在 2^53 以上,因此两个操作数都失败(9007199254740993 % 2 //0)

4

2 回答 2

7

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

%运营商不这样做。

编辑- 嘿,所有支持我的好人:保持你的马:-) C5H8NNaO4指出整数截断过程应该保留低位,如果你考虑只去掉尾数的顶部,这很直观,并且确实一些粗略的“测试”表明它似乎工作正常。

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

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

于 2013-04-12T13:38:24.650 回答
0

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

http://jsperf.com/evenness

我在 Firefox 20 上得到了非常多变的结果,有时 Bitwise 稍微快一点,有时快很多倍。

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

于 2013-04-12T14:17:53.123 回答