Bitshift в javascript
У меня действительно большой номер: 5799218898. И хочу перевести его прямо на 13 бит.
Итак, windows-калькулятор или python дает мне:
5799218898 >> 13 | 100010100100001110011111100001 >> 13
70791 | 10001010010000111
Как и ожидалось.
Но Javascript:
5799218898 >> 13 | 100010100100001110011111100001 >> 13
183624 | 101100110101001000
Я думаю, это из-за внутреннего целочисленного представления в javascript, но ничего не могу найти об этом.
Ответы
Ответ 1
В ECMAScript (Javascript) побитовые операции всегда находятся в 32-разрядной версии. Поэтому 5799218898 рубится на 32-битный, который становится 1504251602. Это целое число → 13 дает 183624.
В Python они являются целыми числами произвольной длины. Поэтому проблем нет.
(И цифры в калькуляторе Windows 64-бит, достаточно, чтобы соответствовать 5799218898.)
(И правильный ответ должен быть 707912.)
Ответ 2
Число, которое у вас есть (5799218898), превышает 32 бит. Вы не упоминали о движке JavaScript, с которым вы тестируете, но очень вероятно, что он 32-разрядный.
Чтобы проверить, обрезайте "5" в начале вашего номера, чтобы вы попали внутрь 32-битной границы. Тогда ваша смена должна работать нормально.
Ответ 3
Как Николас Закас состояния:
Несмотря на то, что номера JavaScript технически хранится в 64-битных, целых значения обрабатываются так, как будто theyre 32 бит, когда побитовые операторы участие.