2009-11-07 6 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

+0

Использование 4294967296 было бы глупо - оно убивает читаемость. 2 ** 32 не является абсурдно дорогим, и он, вероятно, постоянно сложен. 1 << 32 делает так же много смысла. –

+0

Я только что проверил, и Python 3.1 постоянные складки '2 ** 16' и' 2 ** 32'. – u0b34a0f6ae

4

Самый простой способ будет использовать ctypes, чтобы получить такое же поведение переполнения как Javascript:

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

Чтобы получить значение :

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