ビット表現を使用するために、バイト配列を変換しようとしました。
入力:
byte[] values = new byte[]{21, 117, 41, -1};
バイト配列から1つのBitSetオブジェクトを作成したいのですが、問題を調査するためにそれを分割し、配列の各要素から複数のBitSetオブジェクトを作成しようとしました。
BitSetオブジェクトは次の方法で作成されます。
BitSet bitSetTwentyOne = BitSet.valueOf(new byte[]{21});
BitSet bitSetOneHundredSevenTeen = BitSet.valueOf(new byte[{117});
BitSet bitSetFourtyOne = BitSet.valueOf(new byte[]{41});
BitSet bitSetMinusOne = BitSet.valueOf(new byte[]{-1});
ビットは、次の方法を使用して出力されます。
private String getBits(BitSet bitSet) {
StringBuilder bitsBuilder = new StringBuilder();
for (int i = 0; i < bitSet.length(); i++) {
bitsBuilder.append(bitSet.get(i) == true ? 1 : 0);
}
return bitsBuilder.toString();
}
出力:
bitSetTwentyOne: 10101 but expected -> 00010101 (BitSet::length = 5)
bitSetOneHundredSevenTeen: 1010111 but expected -> 01110101 (BitSet::length = 7)
bitSetFourtyOne: 100101 but expected -> 00101001 (BitSet::length = 6)
bitSetMinusOne: 11111111 but it is as expected at least (BitSet::length = 8)
ゼロで埋める必要がある場合でも、すべての値を8ビット幅にします。117と41を変換する場合に、なぜ間違ったバイナリ値が返されるのかわかりません。
ビットを逆方向に印刷しているようです。出力(目的の先行ゼロを除く)が予想される入力の鏡像であることに注意してください。
あなたのコードを使用して、渡す4
必要があります100
、私は得001
ます。ビット0
は最下位ビットであり、最上位ビットではないようです。これを修正するには、インデックスを逆方向にループします。-1
と41
が先行ゼロを除いて正しい理由は、それらのビットセット表現が回文であるためです。
先行ゼロを前に付けるには、length()
から8
を減算し、その数のゼロを出力します。このlength()
メソッドは、数値を表すために必要なビット数のみを返します。これは自分でコーディングする必要があります。BitSet
先行ゼロの機能はありません。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加