javascript sharedArrayBuffer 和按位操作返回 32 位而不是 16 位数字
javascript sharedArrayBuffer and bitwise operations returning a 32bit instead of 16bit number
javascript, 2020:
我从未使用过 sharedArrayBuffer(或位),我有一些问题。基本上我想在单个 Int16Array 元素上存储一组布尔值和一个小计数器(4 位)。但是当我操作内存插槽时-它看起来像变成了 32 位。
const cellbinaryMaintain = 15; //should be last bit position
const bitArray = new SharedArrayBuffer(bufferMemoryAllocation); // double the number of cells
const mainGrid = new Int16Array(bitArray); // 16-bit int
在 for(i) 循环中向下:
mainGrid[i]=setBitToOne(mainGrid[i], cellbinaryMaintain);
其中 'setBit' 函数是:
function setBitToOne(what, bitPos)
{
return what | (1 << bitPos);
}
function setBitToZero(what, bitPos)
{
const mask = ~(1 << bitPos);
return what & mask;
}
但这会导致:
十进制:-32768
二进制:11111111111111111000000000000000
当我要查找的结果是 16 位数字集的最后一位时:
十进制:32768
二进制:1000000000000000
我不习惯使用按位运算符,是否需要屏蔽掉 +16 位?我试过将索引传递给函数,并且在不将值重新分配给新变量的情况下工作,但仍然没有用。
(index, bitPos) //same 11111111111111111000000000000000
{
console.log(mainGrid[index], "value is"); // value is 0
console.log(bitPos, "bit is"); // value is 15
mainGrid[index]|=(1<<bitPos);
}
当我安慰我正在应用的面具时,我当然得到:
十进制:32768
二进制:1000000000000000,
正是我想要的。与以下代码相同:
let num = 0;
let result = (num|=1<<15);
console.log(result, "result");
bLog(result); //binary log
这似乎有效...那么这里发生了什么,为什么这似乎不适用于 Int16Array?
mainGrid
中的值仍然可以 - 您放入其中的位都在那里,没有额外的(毕竟没有空间容纳它们)。但是,这些值会以一种有趣的方式打印出来,因为从 Int16Array
的元素加载意味着(根据定义)最高位被解释为具有值 -32768,而不是 +32768有 Uint16Array
。这样做的实际结果是值在加载时得到符号扩展(JavaScript 中的整个 Number
事情使故事复杂化,但在这里并不重要)。
使用 Uint16Array
不会造成混淆,因为不会发生符号扩展。或者,您可以在打印前手动屏蔽掉多余的位,方法是:
value & 0xFFFF
javascript, 2020: 我从未使用过 sharedArrayBuffer(或位),我有一些问题。基本上我想在单个 Int16Array 元素上存储一组布尔值和一个小计数器(4 位)。但是当我操作内存插槽时-它看起来像变成了 32 位。
const cellbinaryMaintain = 15; //should be last bit position
const bitArray = new SharedArrayBuffer(bufferMemoryAllocation); // double the number of cells
const mainGrid = new Int16Array(bitArray); // 16-bit int
在 for(i) 循环中向下:
mainGrid[i]=setBitToOne(mainGrid[i], cellbinaryMaintain);
其中 'setBit' 函数是:
function setBitToOne(what, bitPos)
{
return what | (1 << bitPos);
}
function setBitToZero(what, bitPos)
{
const mask = ~(1 << bitPos);
return what & mask;
}
但这会导致:
十进制:-32768
二进制:11111111111111111000000000000000
当我要查找的结果是 16 位数字集的最后一位时:
十进制:32768
二进制:1000000000000000
我不习惯使用按位运算符,是否需要屏蔽掉 +16 位?我试过将索引传递给函数,并且在不将值重新分配给新变量的情况下工作,但仍然没有用。
(index, bitPos) //same 11111111111111111000000000000000
{
console.log(mainGrid[index], "value is"); // value is 0
console.log(bitPos, "bit is"); // value is 15
mainGrid[index]|=(1<<bitPos);
}
当我安慰我正在应用的面具时,我当然得到:
十进制:32768
二进制:1000000000000000,
正是我想要的。与以下代码相同:
let num = 0;
let result = (num|=1<<15);
console.log(result, "result");
bLog(result); //binary log
这似乎有效...那么这里发生了什么,为什么这似乎不适用于 Int16Array?
mainGrid
中的值仍然可以 - 您放入其中的位都在那里,没有额外的(毕竟没有空间容纳它们)。但是,这些值会以一种有趣的方式打印出来,因为从 Int16Array
的元素加载意味着(根据定义)最高位被解释为具有值 -32768,而不是 +32768有 Uint16Array
。这样做的实际结果是值在加载时得到符号扩展(JavaScript 中的整个 Number
事情使故事复杂化,但在这里并不重要)。
使用 Uint16Array
不会造成混淆,因为不会发生符号扩展。或者,您可以在打印前手动屏蔽掉多余的位,方法是:
value & 0xFFFF