javascript sharedArrayBuffer和逐位操作返回32位数字,而不是16位数字



javascript,2020:我从未使用过sharedArrayBuffer(或位(,我有一些问题。基本上,我想在一个Int16Array元素上存储一组bool和一个小计数器(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

二进制:111111111111000000000000000

当我寻找的结果是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的值,而不是Uint16Array的+32768。这样做的实际结果是,该值在加载时得到了符号扩展(JavaScript中的整个Number使故事变得复杂,但在这里并不重要(。

使用Uint16Array不那么令人困惑,因为不会发生符号扩展。或者,您可以在打印前手动屏蔽多余的位,方法是:

value & 0xFFFF

最新更新