25

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

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

正如预期的那样。

但是Javascript:

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

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

4

4 回答 4

29

在 ECMAScript (Javascript) 中,按位运算始终是 32 位的。因此 5799218898 被切成 32 位,变成 1504251602。这个整数 >> 13 给出 183624。

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

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

(正确答案应该是 707912。)

于 2010-03-03T18:16:33.623 回答
4

正如尼古拉斯·扎卡斯所说

尽管 JavaScript 数字在技术上以 64 位存储,但只要涉及按位运算符,整数值就会被视为 32 位。

于 2010-03-03T18:23:11.447 回答
4

如果您有一个现代浏览器,您可能希望对大于 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
于 2021-06-27T15:22:05.790 回答
2

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

要进行测试,请修剪数字开头的“5”,使您落在 32 位边界内。那么你的班次应该可以正常工作。

于 2010-03-03T18:17:11.753 回答