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

时间:2017-01-25 09:20:35

标签: java bitset

我尝试在java中学习BitSet集合。我已经读过它在里面使用了比特。

  

位组的每个*组件都有{@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()));

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

我也不理解输出:

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

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

3 个答案:

答案 0 :(得分: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

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

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

答案 1 :(得分:6)

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

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

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

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

0    5    10
|    |    |
000101000100...

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

希望这有帮助。

答案 2 :(得分:4)

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

所以bitSet.set(9);翻转第9位到第1位

输出:

  • System.out.println(bitSet);打印toString的结果,该结果符合JavaDoc:
  

对于此BitSet包含处于set状态的位的每个索引,该索引的十进制表示包含在结果中。小号

逐步分割你的二进制集:1000101000

到字节:10 00101000

这是2和40十进制。