在 javascript 中设置位 31 是否正确

Is it correct to set bit 31 in javascript?

本文关键字:是否 置位 javascript      更新时间:2023-09-26

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

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

这实际上是:

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

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

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

这里有一个解释。

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

唯一使用无符号32-bit整数的 JavaScript 运算符是 >>> 。您可以利用此问题将您一直在使用其他按位运算符处理的有符号整数转换为无符号整数:

(1<<31)>>>0

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

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

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