2
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 = 13;

    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]);

}

これから私が期待するのはこれです。

s0バイナリではb0000_1111_1111_1111

s1バイナリではb0000_0000_0000_1101

shその後、b1101_1111_1111_1111

1は符号で、残りの 15 ビットは値を与えるのでsh、10 進数では です-24575が、これはコンソールに出力されるものではありません (これは です-8193)。

私は何を間違えていますか?

4

3 に答える 3

6

b1101_1111_1111_1111 は -8193 で、正解を出力しています。2 の補数をブラッシュ アップすることをお勧めします。

http://en.wikipedia.org/wiki/Two%27s_complement

于 2012-05-25T19:06:39.487 に答える
6

結果は実際には正しいです。2 進数は、いわゆる 2 の補数で表されます。したがって、負の数の絶対値を計算するには、符号ビットを削除して残りを確認するだけではありません。1. 符号ビットを含むすべてのビットを反転します。 2. 1 を追加します。

あなたの場合、それはあなたが得ることを意味します

  1. 0010_0000_0000_0000
  2. 0010_0000_0000_0001

これは 8193 で、まさに印刷されたものです。

于 2012-05-25T19:07:31.497 に答える
2

使用される表現は符号モジュラスではなく、2 の補数です。したがって、1 で始まる一連のビットで表される数値を知るには、1 を引いて反転する必要があります。あなたの場合、1101_1111_1111_1110 が反転され、正確に 8193 である 0010_0000_0000_0001 が得られます。したがって、まったく問題はありません。内部表現メカニズムを混乱させただけです。

于 2012-05-25T19:08:34.457 に答える