2009-11-07 40 views
2

我需要移植一些JS代碼,它涉及到Math.random()*2147483648)^(new Date).getTime()。雖然它看起來像較小的數字,但python函數和JS函數在功能上是等價的,但是像這樣的大數字,這些值最終會完全不同。JS和Python中^操作符的區別

的Python:

>>> 2147483647^1257628307380 
1257075044427 

的Javascript:

> 2147483647^1257628307380 
-1350373301 

我怎樣才能從蟒蛇的JavaScript值?

回答

7

Python具有無限精度整數,而Javascript使用的是32位整數。您可以手動應用32位的限制得到你想要的結果:

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

更好地使用'1 << 32'或直接'4294967296'而不是'2 ** 32'。 – Gumbo 2009-11-07 22:00:33

+0

使用4294967296會很愚蠢 - 它會殺死可讀性。 2 ** 32不是非常昂貴,而且可能是不斷摺疊的。 1 << 32很容易理解。 – 2009-11-07 22:22:54

+0

我剛剛檢查過,Python 3.1不斷摺疊'2 ** 16'和'2 ** 32'。 – u0b34a0f6ae 2009-11-08 09:56:33

4

最簡單的方法是使用ctypes的得到同樣的溢出行爲,如JavaScript:

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

來獲取值:

>>> ctypes.c_int(1257075044427).value 
-1350373301 
相關問題