假设我有一个比特流,每次都会吐出一个比特流,并且流可以随时停止。记录输出的惯用方法是什么?假设我对此数据结构的主要用法是稍后将其转换为8位块ASCII字符串。 List<Boolean>
听起来不对,因为转换为8位块位数组很麻烦。 BitSet
无法动态增长。 List<Char>
在数字不是8的倍数的吐出位后停止出现问题。有什么想法吗?
答案 0 :(得分:2)
我建议使用ByteBuffer。 http://docs.oracle.com/javase/7/docs/api/java/nio/ByteBuffer.html
答案 1 :(得分:1)
您可以使用long[]
数组和跟踪位数的整数nBits
构建一个BitList:
public class BitList {
private int nBits = 0;
private long[] data = new long[2];
//0 or 1
public void add (byte data) {
if(nBits >= 64*data.length) {
long[] newdata = new long[2*data.length];
for(int i = 0; i < data.length; i++) {
newdata[i] = data[i];
}
this.data = newdata;
}
data[nBits/64] |= data<<(nBits&0x3f);
nBits++;
}
public byte get (int index) {
long val = data[index/64]>>(index&0x3f);
return (byte) (val&0x01);
}
//and so on.
}
或者您可能要等到系统通过将它们打包成字节来吐出8的倍数:
public class Packer {
private byte data;
public byte getData () {
byte result = this.data;
this.data = 0;
return result;
}
//only last bit counts (thus bit is 0 or 1)
public void addBit (byte bit) {
this.data <<= 0x01;
this.data |= bit;
}
}
在这种情况下,Packer
可用于简化实现,因为您可以使用ArrayList<Byte>
并使用整数来跟踪位数(无需实现add
} / remove
/等方法你自己。
答案 2 :(得分:0)
您可能想尝试
List<Byte>
这将最流畅地转换为字节字符串,并且每个字节中的位是可识别的。