Python / Javascript - 整数按位异或问题

4 投票
3 回答
969 浏览
提问于 2025-04-16 08:52

我对这两种语言都很熟悉……但是我在使用整数的按位异或运算符时遇到了问题。在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

撰写回答