Python / Javascript - 整数按位独占或问题

时间:2010-12-21 21:06:01

标签: javascript python integer bit-manipulation xor

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

继续,打开python并执行(-5270299)^ 2825379669

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

结果不同!我不明白为什么!

我必须遗漏一些东西。

3 个答案:

答案 0 :(得分:8)

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

>>> (-5270299 & 0xFFFFFFFF) ^ 2825379669
1472744368L
>>> (-5270299 ^ 2825379669) & 0xFFFFFFFF
1472744368L

答案 1 :(得分:2)

2825379669 适合32位。

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

另一方面,Python高兴地处理整数的long值(超过32位)。

因此,如果你想在JavaScript中获得相同的结果,你将不得不做一些技巧,比如将你的64位整数存储在两个JavaScript数中,然后对这两个数字进行操作。这比将已经可怕的慢速转换为浮动转换为int和返回更慢。

答案 2 :(得分:0)

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

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

>>> hex((-5270299 ^ 2825379669))
'-0xa837b450'
>>> hex((-5270299 ^ 2825379669)+2**32)
'0x57c84bb0'