为什么 Bitset 允许值不同于 1 和 0?

Why Bitset allows values distinct from 1 and 0?

我尝试在 java 中学习 BitSet 集合。我读过它在内部使用位。

Each * component of the bit set has a {@code boolean} value

我写了一个小应用程序:

BitSet bitSet = new BitSet();
bitSet.set(9);
bitSet.set(5);
bitSet.set(3);
System.out.println(bitSet);
System.out.println(Arrays.toString(bitSet.toByteArray()));

我想知道我可以输入不同于 1 和 0 的值。

我也不明白输出:

{3, 5, 9}
[40, 2]

请解释一下这个集合的用法?

BitSet.set(int bitIndex) 将指定索引处的位设置为真。

因此 bitSet.set(9); 将位编号 9 翻转为 1

关于输出:

  • System.out.println(bitSet); 根据 JavaDoc 打印 toString 的结果:

for every index for which this BitSet contains a bit in the set state, the decimal representation of that index is included in the result. S

一步一步,它分裂你的二进制集:1000101000

字节数:10 00101000

这是十进制的 2 和 40。

您设置位编号 3、5 和 9:

byte#      1                 0
index  … 9 8   7 6 5 4 3 2 1 0
value  … 1 0   0 0 1 0 1 0 0 0

二进制 10 是十进制 2 (2¹ = 2).

二进制 00101000 是十进制 40 (2³ + 2⁵ = 8 + 32 = 40)。

BitSet 逻辑上表示一个 "vector of bits that grows as needed" (javadoc).

当您通过 new BitSet() 创建它时,您将所有位设置为 0(假)。

0    5    10
|    |    |
000000000000... (virtually infinite sequence)

使用 set(x) 将位置 x 的位设置为 1(真)(第一个位置为 0);例如在您的代码中启用位 3、5 和 9。

0    5    10
|    |    |
000101000100...

toString() 报告设置为 1 的位列表,即示例中的 3、5 和 9。

toByteArray()BitSet 的内容转换为 byte 值的序列,每个值包含 8 个连续位的值,按 little-endian 顺序(即开始来自 BitSet 中的最少索引)。您示例中的输出 {40, 2} 来自:

 7      0   15     8    <- position in BitSet
 |      |   |      |
{00101000 , 00000010}   <- toByteArray(), binary
    |          |
{  40     ,    2    }   <- toByteArray(), decimal

希望这对您有所帮助。