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 битах могут