Bitshift в JavaScript - PullRequest
       8

Bitshift в JavaScript

21 голосов
/ 03 марта 2010

У меня действительно большое число: 5799218898. И я хочу сдвинуть его до 13 бит.
Итак, Windows-калькулятор или Python дает мне:

5799218898 >> 13 | 100010100100001110011111100001 >> 13
70791            | 10001010010000111

Как и ожидалось.

Но Javascript:

5799218898 >> 13 | 100010100100001110011111100001 >> 13
183624           | 101100110101001000

Я думаю, это из-за внутреннего целочисленного представления в javascript, но ничего не могу найти по этому поводу.

Ответы [ 3 ]

25 голосов
/ 03 марта 2010

В ECMAScript (Javascript) побитовые операции всегда выполняются в 32-битном режиме. Поэтому 5799218898 нарезается на 32-разрядный, который становится 1504251602. Это целое число >> 13 дает 183624.

В Python они являются целыми числами произвольной длины. Так что проблем нет.

(И цифры в калькуляторе Windows 64-разрядные, достаточно, чтобы соответствовать 5799218898.)

(И правильный ответ должен быть 707912.)

2 голосов
/ 03 марта 2010

Как утверждает Николай Закас :

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

2 голосов
/ 03 марта 2010

Число, которое вы имеете (5799218898), превышает 32 бита. Вы не упомянули движок JavaScript, который тестируете, но вполне вероятно, что он 32-битный.

Чтобы проверить, обрежьте «5» в начале вашего номера, чтобы попасть в 32-битную границу. Тогда ваша смена должна работать нормально.

...