4

我一直在玩按位运算以紧凑地存储有关对象的信息,我打算做的是short[][]每个条目存储两条信息,即第一组位(8 位或 4 位)包含信息和然后剩余的位(分别为 8 位或 12 位)存储其余位。

在下面的代码中,我演示了我提到的两个示例,需要遵循的问题;

private void test1() {
    // This test takes a 16 bit binary number and breaks it into two
    // bytes of 8 bits. It then takes the bytes and sticks them back
    // together then outputs their decimal value
    String st = "0011111100110111";
    short s = Short.parseShort(st,2);
    byte[] ba = new byte[] {
        (byte)(s & 0xFF),
        (byte)((s >>> 8) & 0xFF)
        };

    System.out.println(s);
    System.out.println(ba[0]);
    System.out.println(ba[1]);

    byte b0 = ba[0];
    byte b1 = ba[1];

    short sh = (short)((b1 << 8) | b0);

    System.out.println(sh);
}

private void test2() {
    // This test takes two shorts and sticks them together in a
    // 4 bit 12 bit configuration within a short, it then breaks
    // them apart again to see if it worked!
    short s0 = 4095;
    short s1 = 15;

    short sh = (short)((s1 << 12) | s0);

    System.out.println(sh);

    short[] sa = new short[] {
        (short)(sh & 0xFFF),
        (short)((sh >>> 12) & 0xF)
    };

    System.out.println(sa[0]);
    System.out.println(sa[1]);

}

我主要担心的是在 test2() 中我希望只能使用有符号值,但是我似乎能够将值 4095 用于 12 位,将 15 用于 4 位(我预计范围为 -2048 到2047 和 -8 到 7),它如何与这些值一起工作,我错过了什么?

还有一个问题,为什么我不能1011111100110111在 test1() 中使用?

最后,以这种方式存储信息是个好主意吗?该阵列将是大约 500x200 或 1000x 500 之类的东西。

4

1 回答 1

4

4095 在第二行中起作用的原因是因为您在打印之前对其进行了符号扩展。如果您了解无符号 4095 与 -2048 位完全相同,那么您如何解释它们就很重要。

如果您要打印一个 12 位有符号值,它将是:'b1111_1111_1111,它会被解释为 -2048。但是,您将其转换为短片,最后添加了另外 4 位:'b0000_1111_1111_1111. 4095 非常适合这个值。

这同样适用于 15/-8,您在打印之前将其转换为更大的值。

于 2012-05-24T17:13:49.227 回答