2016-01-03 3 views
1

Я столкнулся с проблемой, которая кажется немного странной, и мне интересно, сможет ли кто-нибудь помочь с ней.Смещение целого числа в 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 с некоторым соответствующим кодом упаковывает это помогает

+0

что именно ваша проблема/вопрос? – Louy

+0

То, что вы пытаетесь, вероятно, будет невозможно (или, по крайней мере, несколько сложнее, чем может показаться), потому что не все возможные варианты 64 бит в значении с двойной точностью являются допустимыми числами, и трудно точно знать, что такое CPU/runtime будет с ними работать. – Pointy

+0

На самом деле, я думаю, я забираю это; до тех пор, пока вы будете осторожны с тем, какие бит вы устанавливаете/не устанавливаете, минимум 52 бит по крайней мере должны быть честной игрой. Поймите, что 11 бит экспонента «смещены» на 1023, но в остальном я думаю, что любая комбинация бит там также ОК. Преобразование таких «построенных» значений с плавающей запятой в строки и обратно может быть или не быть надежным. – Pointy

ответ

1

Формат IEEE с плавающей запятой имеет подразумеваемую ведущую цифру 1 на мантиссе, но она на самом деле не присутствует. Другими словами, все допустимые значения имеют ведущий 1 бит, поэтому нет смысла фактически хранить его.

Вы можете посмотреть this jsfiddle I did the other day, чтобы узнать, как представлены значения. Целые числа представляются как двоичные дроби, умноженные на 2, увеличенные до мощности больше 1, за исключением, конечно, целого 1, который имеет мантиссою всех нулей из-за этого ведущего подразумеваемого 1 бит. (На самом деле каждая сила 2 это все-нули в мантиссы.)

редактировать — для справки, наиболее безошибочный способ я знаю, чтобы получить непосредственно в битах в значение с плавающей точкой является использование набран массивы:

var f64 = new Float64Array(1); 
var u8 = new Uint8Array(f64.buffer); 

Это дает 64-битный массив один-элемент, и без знака 8-битный целочисленный массив 8 элементов. Помещенный число в массиве f64:

f64[0] = Math.sin(x); // or whatever 

Тогда u8 массив дает вам 8 байт этого значения, причем наиболее значащий байт (где бит знака и показатель степени являются) в u8[7]. IE версии менее 10 не поддерживают типизированные массивы, а также Opera Mini.

+0

Итак, есть ли способ получить 7 байтов, которые представляют '0' через' Number.MAX_SAFE_INTEGER'? – CoryG

+0

@CoryG Проверьте, что скрипка.Хорошо скажите, что я скопирую код ключа в ответ. – Pointy

+0

Основываясь на [этой скрипке] (https://jsfiddle.net/voupa8u7/3/), похоже, что метод предоставляет меньше базовых данных. – CoryG

Смежные вопросы