在javascript中设置第31位是否正确?

时间:2016-01-20 10:02:02

标签: javascript bitwise-operators bit-shift

当我尝试设置31位0 | 1 << 31时,我得到以下结果:

console.log(0 | 1 << 31); // -2147483648

这是实际的:

console.log((-2147483648).toString(2)) // -10000000000000000000000000000000

设置31位是正确还是应限制为30以防止负值?

2 个答案:

答案 0 :(得分:5)

大多数按位操作被指定为将其操作数转换为 signed 32位整数。使用第31位是完全正确的,但是,你会得到负值。通常,如果你正在进行按位运算并不重要,因为所有你(应该)关心的是位模式,而不是数字的十进制值。

如果你想要一个正值,你可以用>>> 0将其转换回来,因为>>>被指定将其操作数转换为 unsigned 32位整数。

console.log((0 | 1 << 31) >>> 0);

答案 1 :(得分:3)

请参考ECMA5按位运算符和移位运算符以32位整数运算,因此在这种情况下,最大安全整数为2 ^ 31-1或2147483647。

这是一个explanation

  

<<运算符被定义为处理有符号32-bit整数(从双精度浮点数的本机数存储转换)。因此1<<31必须产生负数。

     

使用无符号32-bit整数的唯一JavaScript运算符是>>>。您可以利用它将您正在使用的其他按位运算符中的signed-in-Number转换为无符号整数的数字:

     

(1<<31)>>>0