【问题标题】:javascript sharedArrayBuffer and bitwise operations returning a 32bit instead of 16bit numberjavascript sharedArrayBuffer 和按位运算返回 32 位而不是 16 位数字
【发布时间】:2020-03-27 17:35:20
【问题描述】:

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?

【问题讨论】:

    标签: javascript bit-manipulation bitwise-operators sharedarraybuffer


    【解决方案1】:

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

    使用Uint16Array 不会造成混淆,因为不会发生符号扩展。或者,您可以在打印之前手动屏蔽多余的位,方法是:

    value & 0xFFFF
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-09
      • 1970-01-01
      • 1970-01-01
      • 2013-05-07
      • 1970-01-01
      • 1970-01-01
      • 2012-12-03
      • 1970-01-01
      相关资源
      最近更新 更多