我有一个非常大的数字:5799218898。并且想要将它右移到13位 所以,windows-calculator或python给了我:
5799218898 >> 13 | 100010100100001110011111100001 >> 13 70791 | 10001010010000111
正如所料。
但是Javascript:
5799218898 >> 13 | 100010100100001110011111100001 >> 13 183624 | 101100110101001000
我认为这是因为javascript中的内部整数表示,但找不到任何相关内容。
答案 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