javascript sharedArrayBuffer和按位运算返回32位而不是16位数字

问题描述 投票:1回答:1

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

我不习惯按位运算符,是否需要屏蔽+ 16bit?我尝试将索引传递给函数,并且在没有将值重新分配给新变量的情况下工作,但这仍然行不通。

(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);
} 

并且当我用口罩遮盖时,我正在使用,我当然会得到:

decimal:32768

binary:1000000000000000,

正是我想要的。与以下代码相同:

let num = 0;
let result =  (num|=1<<15);

console.log(result, "result");
bLog(result); //binary log

这似乎有效...所以这里发生了什么,为什么这似乎不适用于Int16Array?

javascript bit-manipulation bitwise-operators sharedarraybuffer
1个回答
1
投票

mainGrid中的值仍然可以-您放入其中的位都在那里,并且没有多余的东西(毕竟没有空间容纳它们)。但是,这些值会以一种有趣的方式打印出来,因为从Int16Array的元素加载意味着(根据定义)意味着最高位被解释为具有-32768的值,而不是原先的+32768一个Uint16Array。这样做的实际结果是,该值在加载时会进行符号扩展(JavaScript中的整个Number事物使故事变得复杂,但在此并不重要)。

使用Uint16Array不会造成混淆,因为不会出现符号扩展。或者,您可以使用以下命令手动掩盖多余的位:

value & 0xFFFF
    
© www.soinside.com 2019 - 2024. All rights reserved.