Python / Javascript - целочисленное побитовое исключение или проблема - PullRequest
3 голосов
/ 22 декабря 2010

Я владею обоими языками ... но у меня проблемы с целочисленным побитовым исключительным или логическим оператором.В javascript он дает мне один результат, в python он дает мне другой ..

Вперед, откройте python и выполните (-5270299) ^ 2825379669

Теперь с javascript выполните те же вычисленияи сообщить результат или что-то еще (например, на http://thorat.org/OS/js.php)

Результаты отличаются! Я понятия не имею, почему!

Я ДОЛЖЕН что-то упустить.

Ответы [ 3 ]

8 голосов
/ 22 декабря 2010

Целые числа JavaScript являются 32-битными, тогда как Python автоматически конвертируется в формат long неограниченной длины, когда значения превышают 32 бита. Если вы явно заставляете Python не подписывать расширение до 32 бит или если вы усекаете результат до 32 бит, то результаты будут такими же:

>>> (-5270299 & 0xFFFFFFFF) ^ 2825379669
1472744368L
>>> (-5270299 ^ 2825379669) & 0xFFFFFFFF
1472744368L
2 голосов
/ 22 декабря 2010

2825379669 не не вписывается в 32 бита.

Все числа в JavaScript являются 64-битными числами с плавающей запятой, но при выполнении над ними битовых операций они сначала преобразуются в 32-битные целые числазатем выполняется побитовая операция, после чего они преобразуются обратно в 64-разрядное число с плавающей запятой.

С другой стороны, Python успешно обрабатывает long значения (более 32 бит) для целых чисел.

Так что, если вы хотите получить тот же результат в JavaScript, вам придется сделать несколько уловок, например, сохранить 64-битное целое число в двух числах JavaScript, а затем выполнить операции с этими двумя.Который будет даже медленнее, чем и без того ужасная медленная встроенная конвертация float в int и обратно.

0 голосов
/ 22 декабря 2010

Нет, это не так.Python просто сохраняет знак из-за того, что он может обрабатывать большие целые числа.

js> ((-5270299) ^ 2825379669).toString(16)
57c84bb0

>>> hex((-5270299 ^ 2825379669))
'-0xa837b450'
>>> hex((-5270299 ^ 2825379669)+2**32)
'0x57c84bb0'
...