我精通这两种语言......但我遇到了整数按位异或逻辑运算符的问题。在 javascript 中,它给了我一个结果,在 python 中,它给了我另一个..
来吧,打开 python 并执行 (-5270299) ^ 2825379669
现在使用 javascript,进行相同的计算,并提醒结果或其他内容(例如http://thorat.org/OS/js.php)
结果不一样!我不知道为什么!
我肯定错过了什么。
我精通这两种语言......但我遇到了整数按位异或逻辑运算符的问题。在 javascript 中,它给了我一个结果,在 python 中,它给了我另一个..
来吧,打开 python 并执行 (-5270299) ^ 2825379669
现在使用 javascript,进行相同的计算,并提醒结果或其他内容(例如http://thorat.org/OS/js.php)
结果不一样!我不知道为什么!
我肯定错过了什么。
JavaScript 的整数是 32 位的,而long
当值超过 32 位时,Python 会自动转换为无限长度格式。如果您明确强制 Python 不签名超过 32 位,或者如果您将结果截断为 32 位,那么结果是相同的:
>>> (-5270299 & 0xFFFFFFFF) ^ 2825379669
1472744368L
>>> (-5270299 ^ 2825379669) & 0xFFFFFFFF
1472744368L
2825379669
不适合32 位。
JavaScript 中的所有数字都是 64 位浮点数,但是在对它们进行按位运算时,它们会先转换为 32 位整数,然后执行按位运算,然后再转换回 64 位浮点数。
另一方面,Python 很乐意处理long
整数的值(超过 32 位)。
因此,如果您想在 JavaScript 中获得相同的结果,则必须做一些技巧,例如将 64 位整数存储在两个 JavaScript 数字中,然后对这两个数字进行操作。这甚至比将 float 转换为 int 并返回的已经可怕的缓慢速度还要慢。
不,他们不是。Python 仅保留符号,因为它可以处理更大的整数。
js> ((-5270299) ^ 2825379669).toString(16)
57c84bb0
>>> hex((-5270299 ^ 2825379669))
'-0xa837b450'
>>> hex((-5270299 ^ 2825379669)+2**32)
'0x57c84bb0'