Java 迭代字节数组中的位

问题描述 投票:0回答:8

如何迭代字节数组中的位?

java arrays byte bit loops
8个回答
43
投票

您必须编写自己的

Iterable<Boolean>
实现,它采用字节数组,然后创建
Iterator<Boolean>
值,该值记住字节数组中的当前索引当前字节内的当前索引。那么像这样的实用方法就会派上用场:

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

(其中

bit
的范围从 0 到 7)。每次调用
next()
时,您都必须增加当前字节内的位索引,如果到达“第 9 位”,则增加字节数组内的字节索引。

并不是真的 - 但有点痛苦。如果您想要示例实现,请告诉我...


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

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;
  }
}

2
投票

另一种方法是使用像您可以在here找到的那样的BitInputStream并编写如下代码:

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

(注意:为简洁起见,代码不包含 EOFException 或 IOException 处理。)

但我会选择 Jon Skeets 的变体并自己做。


1
投票

我的应用程序中需要一些流媒体。 在这里你可以找到我的 BitArray 实现。它不是真正的迭代器模式,但您可以以流方式从数组中请求 1-32 位。文件后面还有一个名为 BitReader 的替代实现。


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


1
投票

除了其他答案中显示的方法之外,您还可以使用

BitSet
来实现此目的:

byte[] bytes=...;
BitSet bitSet=BitSet.valueOf(bytes);
for(int i=0;i<bitSet.length();i++){
    boolean bit=bitSet.get(i);
    //use your bit
} 

BitSet.valueOf
是在Java 7中引入的。


0
投票

您可以迭代字节数组,并为每个字节使用按位运算符迭代其位。

© www.soinside.com 2019 - 2024. All rights reserved.