如何迭代字节数组中的位?
8 回答
您必须编写自己的实现,Iterable<Boolean>
该实现采用一个字节数组,然后创建Iterator<Boolean>
记住字节数组的当前索引和当前字节内的当前索引的值。然后像这样的实用方法会派上用场:
private static Boolean isBitSet(byte b, int bit)
{
return (b & (1 << bit)) != 0;
}
(bit
范围从 0 到 7)。每次next()
被调用时,您都必须在当前字节中增加位索引,如果达到“第 9 位”,则在字节数组中增加字节索引。
这并不难- 但有点痛苦。如果您想要一个示例实现,请告诉我...
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);
}
}
原来的:
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;
}
}
另一种方法是使用您可以在此处找到的 BitInputStream并编写如下代码:
BitInputStream bin = new BitInputStream(new ByteArrayInputStream(bytes));
while(true){
int bit = bin.readBit();
// do something
}
bin.close();
(注意:为简洁起见,代码不包含 EOFException 或 IOException 处理。)
但我会选择 Jon Skeets 的变体并自己做。
我需要在我的应用程序中进行一些流式传输。在这里你可以找到我的 BitArray 实现。它不是真正的迭代器模式,但您可以以流式方式从数组中请求 1-32 位。文件后面还有一个称为 BitReader 的替代实现。
我知道,可能不是“最酷”的方法,但您可以使用以下代码提取每一位。
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
您可以遍历字节数组,并为每个字节使用按位运算符来遍历其位。
或者,您可以BitSet
为此使用:
byte[] bytes=...;
BitSet bitSet=BitSet.valueOf(bytes);
for(int i=0;i<bitSet.length();i++){
boolean bit=bitSet.get(i);
//use your bit
}