Javascript 按位打包/解包-任意值的广义解

Javascript 按位打包/解包-任意值的广义解,javascript,java,bitwise-operators,bit-packing,Javascript,Java,Bitwise Operators,Bit Packing,我试图适应任意的数值 假设我们有3个(未签名)数字: v1,v2,v3 我们知道它们各自的最大值: max1,max2,max3 max1*max2*max3>(尺寸1+2); 这里有一种稍微不同的方法 int max1 = 1000; int max2 = 500; int max3 = 500; 根据最大值的最高有效设置位确定的移位值 int size1 = 32-Integer.numberOfLeadingZeros(max1); int size2 = 32-Integer.num

我试图适应任意的数值

假设我们有3个(未签名)数字:

v1
v2
v3

我们知道它们各自的最大值:

max1
max2
max3

max1*max2*max3<2^32

因此结果(压缩值)应在32位以内


如何在没有“魔法”硬编码的情况下打包/解包这些数字?

让数字按照与参考答案相同的顺序打包,从右到左从
v1开始:

v3 <- v2 <- v1
因此,对于这些常数,一般解应该如下所示:

// packing:
packed = v3 << (size1 + size2) | v2 << size1 | v1;

// unpacking:
v1 = packed & sample1;
v2 = (packed >> size1) & sample2;
v3 = packed >> (size1 + size2);
//打包:
打包=v3尺寸1)和样本2;
v3=打包>>(尺寸1+2);

这里有一种稍微不同的方法

int max1 = 1000;
int max2 = 500;
int max3 = 500;

根据最大值的最高有效设置位确定的移位值

int size1 = 32-Integer.numberOfLeadingZeros(max1);
int size2 = 32-Integer.numberOfLeadingZeros(max2);
int size3 = 32-Integer.numberOfLeadingZeros(max3);

通过补足-1移位大小位确定的掩码值

int mask1 = ~(-1<<size1);
int mask2 = ~(-1<<size2);
int mask3 = ~(-1<<size3);

int v1 = 934;
int v2 = 293;
int v3 = 349;

印刷品

934
293
349
int mask1 = ~(-1<<size1);
int mask2 = ~(-1<<size2);
int mask3 = ~(-1<<size3);

int v1 = 934;
int v2 = 293;
int v3 = 349;

int packed = (((v3<<size2)|v2)<<size1)|v1;
v1 = packed&mask1;
// this saves the shifted packed version for the next step
v2 = (packed = packed>>>size1)&mask2;
v3 = (packed>>>size2)&mask3;
        
System.out.println(v1);
System.out.println(v2);
System.out.println(v3);
934
293
349