测试奇数

Mor*_*ler 8 javascript modulo bitwise-and

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

现在的问题是,有没有使用按位对奇数任何问题的测试和,因为它感觉更自然的测试最右边的位是10不是做对一个模校验2

并且因为32位转换不会改变最右边的位.

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

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

产生相同的结果.

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

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

Poi*_*nty 7

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

%运营商没有做到这一点.

编辑 - 嘿所有你赞美我的好人:抱着你的马:-) C5H8NNaO4指出整数截断过程应该保留低位,如果你想到只是砍掉尾数的顶部,这就很直观,实际上一些粗略的"测试"表明它似乎工作正常.

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

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

  • 有时一杯咖啡看似简单的问题并不那么简单. (3认同)
  • 对于奇偶校验,转换为32位似乎并不重要,正如OP所说.显然它会起作用,即使对于大整数值也是如此. (2认同)
  • @FrançoisWahl:Crockford声称JavaScript比特小的运营商"远离硬件"已经明显过时了. (2认同)
  • @FrançoisWahl:*"我会假设书中的信息是基于事实而不仅仅是假设."*Crockford是一个聪明且消息灵通的人,非常值得一读,但不幸的是他有时会陈述他的*意见*好像这是事实,不利于这本书(特别是关于继承的东西).但在这种情况下,我认为它已经过时了.它最初是在JavaScript引擎取得巨大进步之前发布的,因此必然会在其中偶尔出现过时的语句,而这些语句并未在新版本中被捕获. (2认同)