将3个int打包成short

djmepvbi  于 2021-06-29  发布在  Java
关注(0)|答案(2)|浏览(293)

我在收拾行李
3 int 进入 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};
    }
0vvn1miw

0vvn1miw1#

在一个16位的短代码中,没有足够的位来打包这三个值。
以下是您的详细信息:

160 << 12 = 0x0AA000
50  << 8  = 0x003200
71  << 0  = 0x000047

将这些因素组合在一起会导致:

0xA3247

它可以存储在3字节而不是2字节。当你投出一个短球时

0x3247

如果可以将每个数字分别存储在5位中,则可以在短时间内拟合三个值。
每个数字从 0 - 31 对于无符号值。只有一个值可以占用6位。这将产生 5 + 5 + 6 = 16 位。

cczfrluj

cczfrluj2#

嗯,这是不可能的;让我们看看为什么。我们有 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

我们至少需要21比特( 8 + 7 + 6 )当 char 以及 short 仅为16位值。

相关问题