0

次のコードを使用して変換を行っています。

public static BitSet fromByte(byte b){
    BitSet bs = new BitSet(8);
    for (int i=0; i<8; i++){  
        if ((b & (1 << i)) > 0){  
            bs.set(i);              
        }  
    } 
    int length = bs.length();

    return bs;
}  

出力は {0, 3, 4, 5, 6} (bs のデバッガー表示から) - ビットが設定されているインデックスです。これは長さ = 7 で 1001111 を表す必要があると思いますが、1001111 は 121 ではなく 79 であるため、間違っています。私の予想は 01111001 で、デバッガーの表示は {1,2,3,4,5,7} と表示されます

4

4 に答える 4

2

バイト内のビットは、左から右ではなく、右から左に番号付けされます。そのため、ビットを設定する{0, 3, 4, 5, 6}とこのパターンが定義されます。

7 6 5 4 3 2 1 0
0 1 1 1 1 0 0 1
于 2013-07-05T16:02:04.923 に答える
1

ビットセットの長さは、設定したビットを表すのに必要な数のビットになります。たとえば、最初の 3 ビットを設定すると、表現には 2 ビットしか必要ないため、長さは 2 になります。

BitSet のコンストラクターは、長さではなく、サイズを設定します。それらは2つの異なる概念だと思います。

コードを実行すると、期待どおりの結果が得られます。渡す値に自信がありますか? おそらく、ビットのエンディアンについて混乱していませんか? 通常、左から右ではなく、右から左に読み取られます(またはビッグエンディアンのビット単位の順序

于 2013-07-05T16:02:21.487 に答える
1

次の順序でビットをチェックしています。

00000001 = index 0
00000010 = index 1
00000100 = index 2
00001000 = index 3
etc.

つまり、右から左へ、ビットセットに左から右へ格納します。

于 2013-07-05T16:01:17.273 に答える
1

{0, 3, 4, 5, 6} は次のようになります: (2 ^ 0) | (2 ^ 3) | (2 ^ 4) | (2 ^ 5) | (2^6)

2^0 = 00000001
2^3 = 00001000
2^4 = 00010000
2^5 = 00100000
2^6 = 01000000
--------------
      01111001

ご想像のとおり、0 は 1 に等しいビットのインデックスでもあります。ただし、ビットは右から左に並べられています。

于 2013-07-05T16:01:27.143 に答える