オブジェクトに関する情報をコンパクトに格納するためにビット演算を試してきました。short[][]
エントリごとに2つの情報を格納することを目的としています。つまり、最初のビットセット(8または4)に情報と次に、残りのビット(それぞれ8または12)が残りを格納します。
以下のコードでは、私が言及した2つの例、従うべき質問を示しています。
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ビットには4095、4ビットには15の値を使用できるようです(範囲は-2048〜 2047および-8から7)、これらの値でどのように機能するのですか、何が欠けていますか?
また、別の懸念事項として、1011111100110111
test1()で使用できないのはなぜですか?
最後に、これはこの方法で情報を保存するための良いアイデアですか?アレイは約500x200または1000x500のようなものになります。