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

gst*_*low -11 java bitset

我尝试BitSet在java中学习集合.我已经读过它使用里面的位.

位集的每个*分量都具有{@code boolean}值

我写了一个小应用程序:

BitSet bitSet = new BitSet();
bitSet.set(9);
bitSet.set(5);
bitSet.set(3);
System.out.println(bitSet);
System.out.println(Arrays.toString(bitSet.toByteArray()));
Run Code Online (Sandbox Code Playgroud)

我想知道我可以将值与1和0区分开来.

另外我不明白输出:

{3, 5, 9}
[40, 2]
Run Code Online (Sandbox Code Playgroud)

请解释一下这个系列的用法?

rom*_*m1v 7

您设置位数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
Run Code Online (Sandbox Code Playgroud)

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

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


rro*_*y86 6

BitSet逻辑上表示"根据需要增长的位向量"(javadoc).

通过via创建时new BitSet(),所有位都设置为0(false).

0    5    10
|    |    |
000000000000... (virtually infinite sequence)
Run Code Online (Sandbox Code Playgroud)

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

0    5    10
|    |    |
000101000100...
Run Code Online (Sandbox Code Playgroud)

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

toByteArray()将内容转换BitSet为一系列byte值,每个值包含8个连续位的值,以小端顺序(即从中的最小索引开始BitSet).{40, 2}您的示例中的输出来自:

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

希望这可以帮助.