bod*_*ser 8 javascript byte integer 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;
Run Code Online (Sandbox Code Playgroud)
不幸的是,既没有获得highInt也没有获得lowInt的工作......有人能给我答案我需要如何使用按位运算符吗?
问候
EDIT JavaScript表示使用IEEE双精度格式的整数,因此除了通过自定义大整数库之外,无法在不损失精度的情况下存储任意64位整数.对潜在裁剪值的按位运算显然毫无意义.
通常,对于支持64位整数的语言:
一个64位的模式是0xffffffffffffffff.要提取高32位,您需要移动32 : >> 32. 要提取的低32位,只是和他们32个1: & 0xffffffff.
你有正确的原则 - 关于移位或掩码的位数的算术是错误的.
在 JavaScript 中,所有数字都使用 53 位表示。JavaScript 使用浮点表示在内部存储所有数字,这意味着整数存储为浮点数(尾数有 53 位)
所以用 53 位我们可以表示最大 2^53 = 9007199254740992。
但是即使从 53 位数字中也不能使用右移和 AND 二进制运算来提取低 32 位和高 21 位。
原因是当我们对任何数字应用二元运算符时 - 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);
Run Code Online (Sandbox Code Playgroud)
为了确认上述逻辑是正确的,让我们尝试从两部分构建 bigNumber
Assert((lowInt * Math.pow(2, 32) + highInt) === bigNumber);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6215 次 |
| 最近记录: |