当我尝试设置31位0 | 1 << 31
时,我得到以下结果:
console.log(0 | 1 << 31); // -2147483648
这是实际的:
console.log((-2147483648).toString(2)) // -10000000000000000000000000000000
设置31位是正确还是应限制为30
以防止负值?
答案 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