35

バイト配列のビットを反復するにはどうすればよいですか?

4

8 に答える 8

43

Iterable<Boolean>バイト配列を取り、現在のインデックスをバイト配列に記憶し、現在のインデックスを現在のバイト内に記憶する値を作成するIterator<Boolean>独自の実装を作成する必要があります。次に、次のようなユーティリティ メソッドが役立ちます。

private static Boolean isBitSet(byte b, int bit)
{
    return (b & (1 << bit)) != 0;
}

(bit範囲は 0 ~ 7)。呼び出されるたびnext()に、現在のバイト内でビット インデックスをインクリメントし、「9 番目のビット」に達した場合はバイト配列内でバイト インデックスをインクリメントする必要があります。

それほど難しいことではありませんが、少し苦痛です。サンプル実装が必要な場合はお知らせください...

于 2009-06-23T19:02:19.913 に答える
18
public class ByteArrayBitIterable implements Iterable<Boolean> {
    private final byte[] array;

    public ByteArrayBitIterable(byte[] array) {
        this.array = array;
    }

    public Iterator<Boolean> iterator() {
        return new Iterator<Boolean>() {
            private int bitIndex = 0;
            private int arrayIndex = 0;

            public boolean hasNext() {
                return (arrayIndex < array.length) && (bitIndex < 8);
            }

            public Boolean next() {
                Boolean val = (array[arrayIndex] >> (7 - bitIndex) & 1) == 1;
                bitIndex++;
                if (bitIndex == 8) {
                    bitIndex = 0;
                    arrayIndex++;
                }
                return val;
            }

            public void remove() {
                throw new UnsupportedOperationException();
            }
        };
    }

    public static void main(String[] a) {
        ByteArrayBitIterable test = new ByteArrayBitIterable(
                   new byte[]{(byte)0xAA, (byte)0xAA});
        for (boolean b : test)
            System.out.println(b);
    }
}
于 2009-06-23T20:12:38.213 に答える
10

オリジナル:

for (int i = 0; i < byteArray.Length; i++)
{
   byte b = byteArray[i];
   byte mask = 0x01;
   for (int j = 0; j < 8; j++)
   {
      bool value = b & mask;
      mask << 1;
   }
}

または Java イディオムを使用する

for (byte b : byteArray ) {
  for ( int mask = 0x01; mask != 0x100; mask <<= 1 ) {
      boolean value = ( b & mask ) != 0;
  }
}
于 2009-06-23T19:04:10.753 に答える
2

別の方法は、ここにあるようなBitInputStreamを使用して、次のようなコードを記述することです。

BitInputStream bin = new BitInputStream(new ByteArrayInputStream(bytes));
    while(true){
        int bit = bin.readBit();
        // do something
    }
bin.close();

(注:簡潔にするために、コードにはEOFExceptionまたはIOException処理は含まれていません。)

しかし、私はJon Skeetsバリアントを使用して、自分でそれを行います。

于 2009-06-23T19:19:43.780 に答える
1

私は知っていますが、おそらくそれを行うための「最もクールな」方法ではありませんが、次のコードで各ビットを抽出できます。

    int n = 156;

String bin = Integer.toBinaryString(n);
System.out.println(bin);

char arr[] = bin.toCharArray();
for(int i = 0; i < arr.length; ++i) {
    System.out.println("Bit number " + (i + 1) + " = " + arr[i]);
}

10011100

ビット番号1=1

ビット番号2=0

ビット番号3=0

ビット番号4=1

ビット番号5=1

ビット番号6=1

ビット番号7=0

ビット番号8=0

于 2009-06-23T19:25:33.877 に答える
1

アプリケーションで少しストリーミングする必要がありました。ここで、私の BitArray 実装を見つけることができます。これは実際のイテレータ パターンではありませんが、配列から 1 ~ 32 ビットをストリーミングで要求できます。ファイルの後半には、BitReader と呼ばれる代替実装もあります。

于 2009-06-23T19:14:19.313 に答える
0

バイト配列を反復処理し、各バイトに対してビットごとの演算子を使用してそのビットを反復処理できます。

于 2009-06-23T19:02:35.357 に答える