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());
}
}
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)
我目前正在尝试从 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());
}
}
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)