我遇到了一个似乎有点奇怪的问题,我想知道是否有人可以帮助它。
我使用JavaScript通过node.js存储一些整数,并希望使用从Number.MIN_SAFE_INTEGER
到Number.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包含一些相关代码会对其有所帮助。
答案 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也不支持。