Java 将3整数打包成短整数
我试图将Java 将3整数打包成短整数,java,Java,我试图将3ints打包到short中,然后取回值;我正在使用具有以下值的测试代码: 160, 71, 50 但当我试图解压这些值时,x&z是错误的,我得到15,71,50(请注意15,预计160) 这是为什么?谢谢我的代码是 public static void main(String[] args) { int[] testValue = new int[]{160, 71, 50}; short packed = pack(testValue[
3
int
s打包到short
中,然后取回值;我正在使用具有以下值的测试代码:
160, 71, 50
但当我试图解压这些值时,x&z是错误的,我得到15,71,50
(请注意15
,预计160
)
这是为什么?谢谢我的代码是
public static void main(String[] args) {
int[] testValue = new int[]{160, 71, 50};
short packed = pack(testValue[0], testValue[1], testValue[2]);
int[] output = unpack(packed);
System.out.println(output[0]);
System.out.println(output[1]);
System.out.println(output[2]);
}
public static short pack(int x, int y, int z) {
return (short) (x << 12 | z << 8 | y);
}
public static int[] unpack(short packed) {
int x = packed >> 12 & 0xF;
int y = packed & 0xFF;
int z = packed >> 8 & 0xF;
return new int[]{x, y, z};
}
publicstaticvoidmain(字符串[]args){
int[]testValue=newint[]{160,71,50};
短包装=包装(testValue[0],testValue[1],testValue[2]);
int[]输出=拆包(打包);
System.out.println(输出[0]);
System.out.println(输出[1]);
System.out.println(输出[2]);
}
公共静态短包(整数x,整数y,整数z){
返回(短)(x12&0xF;
int y=压缩&0xFF;
int z=压缩>>8&0xF;
返回新的int[]{x,y,z};
}
好吧,这是不可能的;让我们看看原因。我们有3
值要打包160、71、50
:
160 == 10100000 (binary), 8 bits long
71 == 1000111 (binary), 7 bits long
50 == 110010 (binary), 6 bits long
请注意
160 is 8 bits long
71 is 7 bits long
50 is 6 bits long
------------------
21 bits for all 3 numbers
当
char
以及short
仅为16位值时,我们需要至少21位(8+7+6
)来存储所有三个数字。16位的short中没有足够的位来打包这三个值
以下是您的详细信息:
160 << 12 = 0x0AA000
50 << 8 = 0x003200
71 << 0 = 0x000047
它可以存储在3个字节而不是2个字节中。
当你投到一个空位时,你会以
0x3247
如果可以将每个数字分别存储在5位中,则可以在短时间内拟合三个值
对于无符号值,每个数字的范围为
0-31
。只有一个值能够占用6位。这将产生5+5+6=16
位。您说过您尝试将三个int
压缩到char
,但转换为short
。一个short
只有int
.Y的一半位因此,我们的问题不清楚。索引是什么?char
是16位的值,当160
是8位时,71
是7位,50
是6位。所以我们需要8+7+6==21
位来存储这些值,当我们刚刚有16
时,您在第一个se中错过了char
->short
问题的内容。pack()
返回一个short
,这是一个有符号的16位值。给定在pack()内进行的移位
,x
值为4位,y
值为8位,z
值为4位,支持的值范围为x=0-15,y=0-255,z=0-15
。您的x
和z
值溢出了支持的范围。您不能像那样将这些值打包为16位。有其他打包方法吗?w伊思int@LucasLecce:int
提供32位,假设要打包的所有三个数字实际上都是字节(即0..255
范围内),这就足够了,并且可以节省空间。int result=(a24)&0xFF;b=(result>>16)&0xFF;c=result&0xFF;
是指数字可以变化,并且有多达1000的数字,在这种情况下可以做什么?@Lucas Lecce:您仍然可以使用32位整数(int
)。1000<1024=10位
,因此您需要30位来存储所有3
数字:int result=(a 30)&0x3FF;b=(result>>20)&0x3FF;c=结果&0x3FF;
0x3247