4

我精通这两种语言......但我遇到了整数按位异或逻辑运算符的问题。在 javascript 中,它给了我一个结果,在 python 中,它给了我另一个..

来吧,打开 python 并执行 (-5270299) ^ 2825379669

现在使用 javascript,进行相同的计算,并提醒结果或其他内容(例如http://thorat.org/OS/js.php

结果不一样!我不知道为什么!

我肯定错过了什么。

4

3 回答 3

9

JavaScript 的整数是 32 位的,而long当值超过 32 位时,Python 会自动转换为无限长度格式。如果您明确强制 Python 不签名超过 32 位,或者如果您将结果截断为 32 位,那么结果是相同的:

>>> (-5270299 & 0xFFFFFFFF) ^ 2825379669
1472744368L
>>> (-5270299 ^ 2825379669) & 0xFFFFFFFF
1472744368L
于 2010-12-21T21:14:07.417 回答
2

2825379669适合32 位。

JavaScript 中的所有数字都是 64 位浮点数,但是在对它们进行按位运算时,它们会先转换为 32 位整数,然后执行按位运算,然后再转换回 64 位浮点数。

另一方面,Python 很乐意处理long整数的值(超过 32 位)。

因此,如果您想在 JavaScript 中获得相同的结果,则必须做一些技巧,例如将 64 位整数存储在两个 JavaScript 数字中,然后对这两个数字进行操作。这甚至比将 float 转换为 int 并返回的已经可怕的缓慢速度还要慢。

于 2010-12-21T21:16:35.533 回答
0

不,他们不是。Python 仅保留符号,因为它可以处理更大的整数。

js> ((-5270299) ^ 2825379669).toString(16)
57c84bb0

>>> hex((-5270299 ^ 2825379669))
'-0xa837b450'
>>> hex((-5270299 ^ 2825379669)+2**32)
'0x57c84bb0'
于 2010-12-21T21:17:28.577 回答