【问题标题】:Python / Javascript -- integer bitwise exclusive or problemPython / Javascript - 整数按位异或问题
【发布时间】:2010-12-21 21:06:00
【问题描述】:
我精通这两种语言...但是整数位异或逻辑运算符有问题。在 javascript 中,它给了我一个结果,在 python 中,它给了我另一个..
继续,打开 python 并执行 (-5270299) ^ 2825379669
现在使用 javascript,进行相同的计算,并提醒结果或其他任何内容(例如 http://thorat.org/OS/js.php)
结果不一样!我不知道为什么!
我一定错过了什么。
【问题讨论】:
标签:
javascript
python
integer
bit-manipulation
xor
【解决方案1】:
JavaScript 的整数是 32 位的,而当值超过 32 位时,Python 会自动转换为无限长度 long 格式。如果您明确强制 Python 不签名超过 32 位,或者如果您将结果截断为 32 位,那么结果是相同的:
>>> (-5270299 & 0xFFFFFFFF) ^ 2825379669
1472744368L
>>> (-5270299 ^ 2825379669) & 0xFFFFFFFF
1472744368L
【解决方案2】:
2825379669 不适合 32 位。
JavaScript 中的所有数字都是 64 位浮点数,但是在对它们进行按位运算时,它们会先转换为 32 位整数,然后执行按位运算,然后再转换回 64 位浮点数。
另一方面,Python 很乐意处理整数的 long 值(超过 32 位)。
因此,如果您希望在 JavaScript 中获得相同的结果,则必须采取一些技巧,例如将 64 位整数存储在两个 JavaScript 数字中,然后对这两个数字执行操作。这将比 float 到 int 和返回的内置转换中已经可怕的慢速还要慢。
【解决方案3】:
不,他们不是。 Python 仅保留符号,因为它可以处理更大的整数。
js> ((-5270299) ^ 2825379669).toString(16)
57c84bb0
>>> hex((-5270299 ^ 2825379669))
'-0xa837b450'
>>> hex((-5270299 ^ 2825379669)+2**32)
'0x57c84bb0'