Я столкнулся с проблемой, которая кажется немного странной, и мне интересно, сможет ли кто-нибудь помочь с ней.Смещение целого числа в JavaScript для хранения?
Я использую JavaScript для хранения некоторых целых чисел через node.js и хотел бы использовать полный диапазон целых чисел от Number.MIN_SAFE_INTEGER
до Number.MAX_SAFE_INTEGER
, просто называя отрицательный ноль нулем.
От w3schools, похоже, что разрешено только 52 бита (первые 52 бит), игнорируя знак, чтобы получить Number.MAX_SAFE_INTEGER
, однако он явно равен (2^53) - 1
.
ECMA spec на otherhand говорит, что есть (2^53) - 2
значения (появляющиеся использовать -0
в NaN
.
Я пытаюсь собрать целые числа в наименьшее bitspace возможно, 1-бит (1) знак, 1-бит . (2) для нулевого и оставшихся бит для большего числа последовательно Это прекрасно работает просто добавив несколько строк до последней строки:.
// sign is 0 for positive, 1 for negative and 2 for null
byte[0] = ((temp << 2) & 255) + sign;
byte[1] = (temp >> 6) & 255;
byte[2] = (temp >> 14) & 255;
byte[3] = (temp >> 22) & 255;
byte[4] = (temp >> 30) & 255;
byte[5] = (temp >> 38) & 255;
byte[6] = (temp >> 46) & 255; // produces a negative value prior to applying byte mask
Here's a fiddle с некоторым соответствующим кодом упаковывает это помогает
что именно ваша проблема/вопрос? – Louy
То, что вы пытаетесь, вероятно, будет невозможно (или, по крайней мере, несколько сложнее, чем может показаться), потому что не все возможные варианты 64 бит в значении с двойной точностью являются допустимыми числами, и трудно точно знать, что такое CPU/runtime будет с ними работать. – Pointy
На самом деле, я думаю, я забираю это; до тех пор, пока вы будете осторожны с тем, какие бит вы устанавливаете/не устанавливаете, минимум 52 бит по крайней мере должны быть честной игрой. Поймите, что 11 бит экспонента «смещены» на 1023, но в остальном я думаю, что любая комбинация бит там также ОК. Преобразование таких «построенных» значений с плавающей запятой в строки и обратно может быть или не быть надежным. – Pointy