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