用位掩码打包和解包整数

3
我想将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
问题可能是掩码太大了,所以您正在将其推到极限。运行此代码以查看:

(1<<30).toString(2) 是最大值。

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


有解决方案的任何想法吗? - trshmanx

0

原来我在开头浪费了一些位元。解决方案是:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接