JS和Python中^操作符的区别

JS和Python中^操作符的区别

问题描述:

我需要移植一些JS代码,它涉及到Math.random()*2147483648)^(new Date).getTime()。虽然它看起来像较小的数字,但python函数和JS函数在功能上是等价的,但是像这样的大数字,这些值最终会完全不同。JS和Python中^操作符的区别

的Python:

>>> 2147483647^1257628307380 
1257075044427 

的Javascript:

> 2147483647^1257628307380 
-1350373301 

我怎样才能从蟒蛇的JavaScript值?

Python具有无限精度整数,而Javascript使用的是32位整数。您可以手动应用32位的限制得到你想要的结果:

def xor32bit(a, b): 
    m = (a^b) % (2**32) 
    if m > (2**16): 
     m -= 2**32 
    return m 
+0

更好地使用'1 Gumbo 2009-11-07 22:00:33

+0

使用4294967296会很愚蠢 - 它会杀死可读性。 2 ** 32不是非常昂贵,而且可能是不断折叠的。 1 2009-11-07 22:22:54

+0

我刚刚检查过,Python 3.1不断折叠'2 ** 16'和'2 ** 32'。 – u0b34a0f6ae 2009-11-08 09:56:33

最简单的方法是使用ctypes的得到同样的溢出行为,如JavaScript:

>>> import ctypes 
>>> ctypes.c_int(1257075044427) 
c_long(-1350373301) 

来获取值:

>>> ctypes.c_int(1257075044427).value 
-1350373301