在javascript中的Bitshift

And*_*rew 21 javascript bit-shift

我有一个非常大的数字:5799218898.并希望将其右移到13位.
所以,windows-calculator或python给了我:

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

正如所料.

但是Javascript:

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

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

ken*_*ytm 26

在ECMAScript(Javascript)中,按位操作始终为32位.因此,5799218898被斩波成32位,变为1504251602.这个整数>> 13给出了183624.

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

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

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


小智 6

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

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

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

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

> Number(BigInt(5799218898) >> BigInt(13))
<- 707912
Run Code Online (Sandbox Code Playgroud)