JavaScript:长长数字的按位移位

IT技术 javascript
2021-02-27 17:15:17

我需要在 JavaScript 中按位移动一个值 64 次。但是 JavaScript 在32.

例如:

for(var j = 0; j < 64; j++)
{
    mask = mask << 1;
    console.log(mask);
}

这将从0to打印值,1073741824然后轮次并开始打印0

2个回答

“在 Java 中,按位运算符处理整数。JavaScript 没有整数。它只有双精度浮点数。因此,按位运算符将它们的数字操作数转换为整数,做他们的事情,然后将它们转换回来。 “在大多数语言中,这些操作符离硬件很近,速度也很快。在 JavaScript 中,它们离硬件很远,很慢。JavaScript 很少用于位操作。” - Douglas Crockford,Javascript:好的部分

关键是您真的没有任何理由使用按位运算符。只需乘以或除以 2^numbits。

你的代码应该是:

for(var j = 0; j < 64; j++) {
 mask = mask * 2;
 console.log(mask);
}

或者一般:

function lshift(num, bits) {
    return num * Math.pow(2,bits);
}

你明白了。

小心:上面的代码有效,但只能达到 52 位尾数 - 而不是 64 位!如果你设置掩码=1; 然后运行上面的代码,它以 18446744073709552000 结尾 - 但 2^64 实际上是 18446744073709551616。最后 4 位数字被空白,因为 52 位不能容纳 64 位:-(
2021-04-22 17:15:17

JavaScript 最初将其所有数字存储为 64 位,但是一旦您开始使用按位运算符,解释器就会将数字转换为 32 位表示。

位运算符在 JS 中有点老套,所以烦人的是你可能需要做一些更聪明的事情,比如编写自己的 64 位函数。

Javascript 没有整数作为语言中的可见类型;所有数字都是双精度(64 位)浮点数。那些最多只能容纳 53 位尾数,64 位整数不适合。所以当它内部转换为整数并返回时,它只使用 32 位。
2021-04-25 17:15:17