在javascript中的Bitshift

时间:2010-03-03 18:13:44

标签: javascript bit-shift

我有一个非常大的数字:5799218898。并且想要将它右移到13位 所以,windows-calculator或python给了我:

5799218898 >> 13 | 100010100100001110011111100001 >> 13
70791            | 10001010010000111

正如所料。

但是Javascript:

5799218898 >> 13 | 100010100100001110011111100001 >> 13
183624           | 101100110101001000

我认为这是因为javascript中的内部整数表示,但找不到任何相关内容。

4 个答案:

答案 0 :(得分:25)

在ECMAScript(Javascript)中,按位操作始终为32位。因此,5799218898被切成32位,变为1504251602.该整数>> 13给出183624。

在Python中,它们是任意长度的整数。所以没有问题。

(Windows计算器中的数字是64位,足以容纳5799218898。)

(正确的答案应该是707912。)

答案 1 :(得分:2)

您拥有的号码(5799218898)超过32位。你没有提到你正在测试的JavaScript引擎,但它很可能是32位。

要测试,请修剪数字开头的“5”,使其落入32位边界内。那么你的转变应该可以正常工作。

答案 2 :(得分:2)

作为Nicholas Zakas states

  

即使JavaScript数字是   技术上存储在64位整数   值被视为32   按位运算符的位数   参与。

答案 3 :(得分:0)

如果您使用的是现代浏览器,您可能希望对大于 32 位有符号的值使用 bigint。它们于 2020 年在第 11 版 ECMAScript 语言中引入。

据说,您还可以找到浏览器兼容性表:

<块引用>

也支持按位运算符,除了 >>>(零填充右移),因为每个 BigInt 值都是有符号的。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/BigInt

您可以执行以下操作,例如在 Chrome 中进行了测试:

> Number(BigInt(5799218898) >> BigInt(13))
<- 707912