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
答
最简单的方法是使用ctypes的得到同样的溢出行为,如JavaScript:
>>> import ctypes
>>> ctypes.c_int(1257075044427)
c_long(-1350373301)
来获取值:
>>> ctypes.c_int(1257075044427).value
-1350373301
更好地使用'1 Gumbo 2009-11-07 22:00:33
使用4294967296会很愚蠢 - 它会杀死可读性。 2 ** 32不是非常昂贵,而且可能是不断折叠的。 1 2009-11-07 22:22:54
我刚刚检查过,Python 3.1不断折叠'2 ** 16'和'2 ** 32'。 – u0b34a0f6ae 2009-11-08 09:56:33