Точность побитового сдвига

#javascript #bitwise-operators

#javascript #побитовые операторы

Вопрос:

Я пытаюсь перенести библиотеку Python на Javascript, но наткнулся на числовую разницу между ними..

С помощью Python, 1057618395136 >> 16 == 16137976 С помощью Javascript, 1057618395136 >> 16 == 16120

Я прочитал, что целочисленная точность в Javascript составляет 53 бита, Math.pow(2, 53) == 9007199254740991), что все еще находится в пределах диапазона операции бифшифта, которую я пытаюсь выполнить.. Чего мне не хватает?

Ответ №1:

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

Чтобы сдвинуть вправо на 16 бит в JavaScript, вы можете разделить на 65536.

Комментарии:

1. Спасибо, это имеет смысл! Из любопытства (я знаю, что такими микрооптимизациями пренебрегают), есть ли разница в производительности между битовым сдвигом и разделением?

2. @Martijnh что ж, возможно, среда выполнения JavaScript распознает тот факт, что вы делите на константу, равную степени 2. Большинство современных аппаратных средств (кроме недорогих телефонов), вероятно, могут выполнять 64-разрядные операции сдвига. Делают ли это какие-либо реальные реализации, я не знаю.