如何将64位整数分割为两个32位整数

时间:2013-02-06 14:44:24

标签: javascript integer byte bit-manipulation

我想将64位整数分成两个32位整数:

var bigInt = 0xffffff;

var highInt = bigInt >> 8 // get the high bits 0xfff
var lowInt = bigInt // cut of the first part (with &)?

console.log(highInt); // 0xfff
console.log(lowInt); // 0xfff

// set them together again
var reBigInt = (highInt << 8) + lowInt;

不幸的是,没有得到highInt也没有得到lowInt的工作......有人能给我答案我需要如何使用按位运算符吗?

问候

2 个答案:

答案 0 :(得分:6)

编辑 JavaScript表示整数using IEEE double precision format,因此除非通过自定义大整数库,否则无法在不损失精度的情况下存储任意64位整数。对潜在裁剪值的按位运算显然毫无意义。


通常,对于支持64位整数的语言:

一个64位的模式是0xffffffffffffffff。要提取高32位,您需要移动32:>> 32。要提取低32位,只需要提取32位:& 0xffffffff

你有正确的原则 - 关于移位或掩码的位数的算术是错误的。

答案 1 :(得分:4)

在JavaScript中,所有数字都使用53位表示。 JavaScript使用浮点表示在内部存储所有数字,这意味着整数存储为浮点数(尾数有53位)

因此,对于53位,我们可以表示最大值2 ^ 53 = 9007199254740992。

但是你不能使用右移和AND二进制运算来提取低32位和高21位甚至53位数。

原因是当我们对任何数字应用二元运算符时 - Javascript首先将该数字转换为32位有符号数,应用二进制运算并返回结果。这意味着任何位于高于32位的位都将被丢弃。

我使用以下方法从正数<= 2 ^ 53中提取较高(21位)和较低(32位)的部分。

var bigNumber = Math.pow(2, 53); // 9007199254740992
var bigNumberAsBinaryStr = bigNumber.toString(2); // '100000000000000000000000000000000000000000000000000000'
// Convert the above binary str to 64 bit (actually 52 bit will work) by padding zeros in the left
var bigNumberAsBinaryStr2 = ''; 
for (var i = 0; i < 64 - bigNumberAsBinaryStr.length; i++) {
    bigNumberAsBinaryStr2 += '0'; 
}; 

bigNumberAsBinaryStr2 += bigNumberAsBinaryStr;

var lowInt = parseInt(bigNumberAsBinaryStr2.substring(0, 32), 2);
var highInt = parseInt(bigNumberAsBinaryStr2.substring(32), 2);

只是为了确认上面的逻辑是正确的,让我们尝试从两个部分构建bigNumber

Assert((lowInt * Math.pow(2, 32) + highInt) === bigNumber);