Ni55aN
@Ni55aN

Почему неправильно работают операторы с 64 битным числом?

var n = Math.pow(2,63) // 9223372036854776000
n.toString(2) // "1000000000000000000000000000000000000000000000000000000000000000"
n.toString(2).length // 64


Все хорошо, пока не попробую применить побитовые операции
n>>1 // 0
n | 678 // 678


Такое ощущение, что перед побитовой обработкой число по битам обрезается. Но есть еще одно:
var n = Math.pow(2,63) - 5; //9223372036854776000
Дает то самое число, не видя -5

> var n = Math.pow(2,63)-16;
undefined
> Math.pow(2,63)-64 === Math.pow(2,63)
true // и такое

Нашел вот такую информацию

Из этого следует, что придется обходиться только 53 битными при работе с битами или проведении арифметических операций, хотя представить имеющееся число больше 53 битов JS умеет

bits:  54 num:  9007199254740992  num + 0: 9007199254740992
bits:  54 num:  9007199254740992  num + 1: 9007199254740992
bits:  54 num:  9007199254740992  num + 2: 9007199254740994
bits:  54 num:  9007199254740992  num + 3: 9007199254740996
bits:  54 num:  9007199254740992  num + 4: 9007199254740996
bits:  54 num:  9007199254740992  num + 5: 9007199254740996
bits:  54 num:  9007199254740992  num + 6: 9007199254740998
bits:  54 num:  9007199254740992  num + 7: 9007199254741000

Number.MAX_SAFE_INTEGER.toString(2).length // 53


Но побитовые операторы и с этими не работают, только с 31 битными.
И финальный вопрос: есть ли способ обработать бинарными операторами числа больше 32 бит ? Арифметические, как выяснилось, еще на 53 битах могут
  • Вопрос задан
  • 391 просмотр
Решения вопроса 2
Ivanq
@Ivanq
Знаю php, js, html, css
Числа в JS на самом деле - float. И в float 2 ^ 63 можно представить, а в int - нет. Битовые операции проводятся над интом, то есть float переводится в int, и биты теряются. Можно разбить число на несколько меньших, проводить операции на них, а потом склеивать.
Ответ написан
Комментировать
sergiks
@sergiks Куратор тега JavaScript
♬♬
Самое большое целое в JS: (253 - 1)

Минимальное целое: (-(253 - 1))

(источник)

Операнды всех битовых операций конвертируются в 32-х битовые целые со знаком представленные в дополнительном коде и с использованием порядка битов от "старшего к младшему".

Битовые операции с 64-битными – никак. Бейте на два 32-битных.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы