为了紧凑地存储有关对象的信息,我一直在进行按位运算,我打算做的是使用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()中,我希望只能使用带符号的值,但是对于12位和4位,我似乎都可以使用值4095(我希望范围是-2048到2047和-8到7),这些值如何运作,我想念的是什么?
还有另一个问题,为什么我不能在test1()中使用
1011111100110111
?最后,以这种方式存储信息是一个好主意吗?这样的数组大约是500x200或1000x 500。
最佳答案
4095在第二行中起作用的原因是,您在打印之前先将其扩展。如果您知道无符号4095与-2048完全相同,那么解释它们就很重要。
如果要打印12位带符号的值,则为:'b1111_1111_1111
,它将被解释为-2048。但是,您将其转换为简短内容,并在末尾添加了另外4位:'b0000_1111_1111_1111
。 4095适合该值。
同样适用于15 / -8,在打印之前将其投射为较大的值。