JavaScript:long long number 的位移位

新手上路,请多包涵

我需要在 JavaScript 中将一个值按位移动 64 次。但是 JavaScript 在 32 之后开始舍入。

例如:

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

这打印值从 01073741824 但随后开始打印 0

原文由 sandi 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 449
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);
}

你明白了。

原文由 itsadok 发布,翻译遵循 CC BY-SA 4.0 许可协议

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

按位运算符在 JS 中有点 hacky,所以令人恼火的是你可能不得不做一些更聪明的事情,比如编写你自己的 64 位函数。

原文由 adam 发布,翻译遵循 CC BY-SA 2.5 许可协议

推荐问题