我精通两种语言......但我遇到整数按位异或逻辑运算符的问题。在javascript中,它给了我一个结果,在python中它给了我另一个..
继续,打开python并执行(-5270299)^ 2825379669
现在使用javascript,进行相同的计算,并提醒结果或其他任何内容(例如http://thorat.org/OS/js.php)
结果不同!我不明白为什么!
我必须遗漏一些东西。
答案 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'