Java可调整大小的位数组?

时间:2014-04-23 18:55:59

标签: java

假设我有一个比特流,每次都会吐出一个比特流,并且流可以随时停止。记录输出的惯用方法是什么?假设我对此数据结构的主要用法是稍后将其转换为8位块ASCII字符串。 List<Boolean>听起来不对,因为转换为8位块位数组很麻烦。 BitSet无法动态增长。 List<Char>在数字不是8的倍数的吐出位后停止出现问题。有什么想法吗?

3 个答案:

答案 0 :(得分:2)

答案 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>

这将最流畅地转换为字节字符串,并且每个字节中的位是可识别的。