最常见的是,模运算符%用于测试偶数或奇数。
现在我的问题是,使用逐位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)
发布于 2013-04-12 21:38:25
在JavaScript中,使用任何按位运算符都会导致数字首先被截断为32位整数。这意味着它对一些较大的值不起作用。(好吧,有很多更大的值:-)
%操作符不会这样做。
C5H8NNaO4指出,整数截断过程应该保留低位,如果你只考虑去掉尾数的顶部,这是有直觉的,实际上,一些粗略的“测试”表明它似乎工作得很好。
当然,对于非常大的值,事情变得更加复杂,当用不精确的浮点数表示时,可能是奇数或偶数,因为缺少最低有效的数字。换句话说,当浮点值中的二进制指数产生一个大于尾数容量(我认为是53位)的有效值时,你要么必须考虑所有这样的数字为偶数(因为低位总是零),要么你必须认为问题是不确定的。
应该清楚的是,我不是一个数学家。
发布于 2013-04-12 22:17:53
如果您的数字总是可以很好地转换为32位整数,那么Bitwise看起来可以更快--我猜一些javascript引擎可以将其快速转换为硬件位操作。我已经构建了一个jsperf来测试它:
http://jsperf.com/evenness
我在Firefox20上得到的结果非常不稳定,有时Bitwise稍微快一些,有时快很多倍。
如果你的数字可以或者不能很好地转换成32位整数,那么坚持模数。
https://stackoverflow.com/questions/15972835
复制相似问题