Python / Javascript - 整数按位异或问题
我对这两种语言都很熟悉……但是我在使用整数的按位异或运算符时遇到了问题。在JavaScript中,它给我的结果是一个,而在Python中却是另一个……
来吧,打开Python,执行这个计算:(-5270299) ^ 2825379669
然后在JavaScript中做同样的计算,弹出结果或者其他什么(可以参考这个例子:http://thorat.org/OS/js.php)
结果是不同的!我完全不知道为什么!
我一定是漏掉了什么。
3 个回答
0
不,它们不是。Python 只是保留了符号,因为它可以处理更大的整数。
js> ((-5270299) ^ 2825379669).toString(16)
57c84bb0
>>> hex((-5270299 ^ 2825379669))
'-0xa837b450'
>>> hex((-5270299 ^ 2825379669)+2**32)
'0x57c84bb0'
2
2825379669
这个数字不能放进32位的空间里。
在JavaScript中,所有的数字都是64位的浮点数,但当你对这些数字进行位运算时,它们会先被转换成32位的整数,然后再进行位运算,最后再转换回64位的浮点数。
而Python就比较友好,它可以直接处理超过32位的整数,也就是long
类型的值。
所以如果你想在JavaScript中得到和Python一样的结果,你就得想办法,比如把你的64位整数分成两个JavaScript数字,然后对这两个数字进行操作。这样做的速度会比JavaScript自带的浮点数和整数之间的转换还要慢,毕竟那个转换本身就已经很慢了。
9
JavaScript中的整数是32位的,也就是说它能表示的数字范围是有限的。而Python则比较聪明,当数字超过32位时,它会自动把这些数字转换成没有长度限制的long
格式。如果你强制Python不让它超过32位,或者把结果截断到32位,那么这两种情况下的结果就是一样的:
>>> (-5270299 & 0xFFFFFFFF) ^ 2825379669
1472744368L
>>> (-5270299 ^ 2825379669) & 0xFFFFFFFF
1472744368L