BitSet 有时会掉落 Bits

BitSet sometimes drops Bits

我目前正在尝试从 Java 中的文件读取单个位。

我将数据读入一个字节数组,然后将字节数组转换为一个位集。

问题是有时转换后的 Bitset 中会缺少一些位。

在下面的示例中,我有 2 个字节数组,每个数组有 25 个非常相似的字节。但是一个被转换成预期的 200 位,另一个被转换成只有 197 位,我不知道为什么。

import java.nio.ByteBuffer;
import java.util.BitSet;

public class Main {
    public static void main(String[] args) {
        ByteBuffer cb = ByteBuffer.wrap(new byte[] {(byte)0x18,(byte)0x8C,(byte)0x18,(byte)0x18,(byte)0x18,(byte)0x18,(byte)0x18,(byte)0x18,(byte)0x18,(byte)0x18,(byte)0x18,(byte)0x18,(byte)0x18,(byte)0x18,(byte)0x18,(byte)0x18,(byte)0x18,(byte)0x18,(byte)0x18,(byte)0x18,(byte)0x18,(byte)0x18,(byte)0x18,(byte)0x18,(byte)0x18,});
        BitSet cBits = BitSet.valueOf(cb);
        System.out.println(cBits.length());
        ByteBuffer db = ByteBuffer.wrap(new byte[] {(byte)0x17,(byte)0x8c,(byte)0x18,(byte)0x18,(byte)0x18,(byte)0x18,(byte)0x18,(byte)0x18,(byte)0x18,(byte)0x18,(byte)0x18,(byte)0x18,(byte)0x18,(byte)0x18,(byte)0x18,(byte)0x18,(byte)0x18,(byte)0x18,(byte)0x18,(byte)0x18,(byte)0x18,(byte)0x18,(byte)0x18,(byte)0x8c,(byte)0x8c,});
        BitSet dBits = BitSet.valueOf(db);
        System.out.println(dBits.length());
    }
}

Doodle

Java 位集的 length() 是最高有效位设置的结果,而不是传递的数组的长度。这与 bitset 的描述是一致的,它是一种根据需要增长的数据结构——它的逻辑大小是其设置位的结果,而不是某些底层缓冲区的物理容量。

Returns the "logical size" of this BitSet: the index of the highest set bit in the BitSet plus one. Returns zero if the BitSet contains no set bits.

您的第一个示例的最高有效字节为 0x18,或二进制 00011000。三个前导零位解释了与第二个位集相比的差异,第二个位集的最高有效字节为 0x8c (10001100)