在JavaScript中移动整数以进行存储?

时间:2016-01-03 16:35:33

标签: javascript numbers bitmask

我遇到了一个似乎有点奇怪的问题,我想知道是否有人可以帮助它。

我使用JavaScript通过node.js存储一些整数,并希望使用从Number.MIN_SAFE_INTEGERNumber.MAX_SAFE_INTEGER的整个范围的整数,只需将负零调整为零。

w3schools出现,只有52位允许(前52位),忽略符号,以检索Number.MAX_SAFE_INTEGER,但它明显等于(2 ^ 53) - 1

另一方面,ECMA spec表示有(2 ^ 53) - 2个值(似乎使用-0作为NaN

我试图将整数打包到可能的最小位空间,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包含一些相关代码会对其有所帮助。

1 个答案:

答案 0 :(得分:1)

IEEE浮点格式在尾数上有一个隐含的前导1位,但它实际上并不存在。换句话说,所有有效值都有前导1位,因此实际上没有明确存储它。

您可以查看this jsfiddle I did the other day以查看值的表示方式。整数表示为二进制分数乘以2,增加到大于1的幂,当然除了整数1,其尾数为全零,因为该隐含的隐含{ {1}}位。 (实际上1的每个幂都是尾数中的全零。)

编辑 - 作为参考,我知道直接获取浮点值中的位的最可靠方法是使用类型化数组:

2

它为您提供了一个单元素64位数组和一个8元素无符号8位int数组。在var f64 = new Float64Array(1); var u8 = new Uint8Array(f64.buffer); 数组中输入一个数字:

f64

然后f64[0] = Math.sin(x); // or whatever 数组为您提供该值的8个字节,其中最重要的字节(符号位和指数位于u8处)。小于10的IE版本不支持类型化数组,Opera Mini也不支持。