在位掩码中打包和解包整数
Pack and unpack integers in bit mask
我想将 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 位限制,但理论上不应该?
问题可能是掩码太大,因此您将其推到了极限。 运行此代码脚趾看到:
(1<<30).toString(2)
最大
console.info((1<<30).toString(2))
原来我一开始是在浪费一些位。解决方案是:
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);
我想将 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 位限制,但理论上不应该?
问题可能是掩码太大,因此您将其推到了极限。 运行此代码脚趾看到:
(1<<30).toString(2)
最大
console.info((1<<30).toString(2))
原来我一开始是在浪费一些位。解决方案是:
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);