javascript sharedArrayBuffer и побитовые операции, возвращающие 32-битное число вместо 16-битного числа - PullRequest
1 голос
/ 27 марта 2020

javascript, 2020: я никогда не работал с sharedArrayBuffer (или битами), и у меня есть несколько вопросов. По сути, я хочу хранить набор значений bools и небольшой счетчик (4-битный) в одном элементе Int16Array. но когда я манипулирую слотом памяти - похоже, он меняется на 32-битный. где функции '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?

1 Ответ

1 голос
/ 27 марта 2020

Значения в mainGrid все еще в порядке - биты, которые вы в него вставили, там, и никаких дополнений (в конце концов, для них нет места). Тем не менее, значения будут напечатаны забавным способом, потому что загрузка из элемента из Int16Array означает (по определению), что старший бит интерпретируется как имеющий значение -32768 вместо +32768, которое он имел бы для Uint16Array. Практическое следствие этого заключается в том, что значение загружается со знаком при загрузке (вся вещь Number в JavaScript усложняет историю, но не так, как это важно здесь).

Использование Uint16Array - это менее запутанным, поскольку не происходит расширение знака. В качестве альтернативы вы можете вручную замаскировать дополнительные биты перед печатью, используя:

value & 0xFFFF
...