#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-разрядные операции сдвига. Делают ли это какие-либо реальные реализации, я не знаю.