Упаковать и распаковать целые числа в битовой маске - PullRequest
3 голосов
/ 01 февраля 2020

Я хочу упаковать lod в 2 бита и x,y,z каждый в 10 бит (что составляет 32 бита в сумме). До сих пор я кодировал это https://jsfiddle.net/wgdphzL1/2/:

console.clear();

var mask = 0;
var lod = 3;
var x = 5;
var y = 8;
var z = 5;

mask|=(lod & 3);
mask|=(x & 1023) << 10;
mask|=(y & 1023) << 20;
mask|=(z & 1023) << 30;


var lodr = mask & 3;
var xr = (mask >> 10) & 1023;
var yr = (mask >> 20) & 1023;
var zr = (mask >> 30) & 1023;

console.log(lodr, xr, yr, zr); // 3 5 8 1

И это работает, кроме последнего zr в неправильном. И это моя проблема. Такое ощущение, что я перехожу 32-битный лимит, но теоретически не должен?

Ответы [ 2 ]

0 голосов
/ 01 февраля 2020

Так что получается, что я терял некоторые биты в начале. Решение:

console.clear();

var mask = 0;

var lod = 3;
var x = 5;
var y = 8;
var z = 12;

mask|=(lod & 3); 
mask|=(x & 1023) << 2; 
mask|=(y & 1023) << 12; 
mask|=(z & 1023) << 22; 


var lodr = mask & 3;
var xr = (mask >> 2) & 1023;
var yr = (mask >> 12) & 1023;
var zr = (mask >>> 22);

console.log(lodr, xr, yr, zr);
0 голосов
/ 01 февраля 2020

Проблема, вероятно, в том, что маска слишком велика, поэтому вы превышаете лимит. Запустите этот код, чтобы увидеть:

(1<<30).toString(2) это максимум.

console.info((1<<30).toString(2))
...