4

オブジェクトに関する情報をコンパクトに格納するためにビット演算を試してきました。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)、これらの値でどのように機能するのですか、何が欠けていますか?

また、別の懸念事項として、1011111100110111test1()で使用できないのはなぜですか?

最後に、これはこの方法で情報を保存するための良いアイデアですか?アレイは約500x200または1000x500のようなものになります。

4

1 に答える 1

4

4095 が 2 行目で機能する理由は、印刷する前に署名を拡張しているためです。符号なし 4095 が -2048 とまったく同じビットであることを理解していれば、それらをどのように解釈するかが問題になります。

12 ビットの符号付きの値を出力する場合、'b1111_1111_1111これは次のようになり、-2048 と解釈されます。ただし、これを short にキャストして、最後にさらに 4 ビットを追加します: 'b0000_1111_1111_1111。4095 はこの値内に収まります。

同じことが 15/-8 にも当てはまります。印刷する前により大きな値にキャストしています。

于 2012-05-24T17:13:49.227 に答える