2017-01-25 22 views
-11

我尝试在java中学习BitSet集合。我读过它使用里面的位。为什么Bitset允许不同于1和0的值?

每个*位组的组件有一个{@code布尔}值

我写了一个小程序:

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] 

请解释说明此集合的用法?

+6

https://docs.oracle.com/javase/8/docs/api/java/util/BitSet.html没有冒犯 - 但我希望6k +用户知道如何查找oracle文档的集合类,阅读并理解它... – Fildor

+0

@Fildor我从此页面的引用,你可以看到 – gstackoverflow

+0

这并没有让它变得更好。你为什么不理解文档?我们怎么能给你更多或更好的解释,而不是你可以在那里读到的?对我来说这很清楚。我只是想明白为什么它不适合你。 – Fildor

回答

6

BitSet逻辑上表示“根据需要增长的位向量”(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 

希望这有助于。

+0

附加问题:当我声明BitSet bits = new BitSet(8);''那么我可以没有问题执行'bits.set(15);'或检索'bits.get(85);'(夸大,我知道,但只是为了表明这一点)。当在BitSet.java中查找'public void set(int bitIndex)'的实现时,我发现只有在索引为负数时才抛出异常(足够公平)。但为什么不当你超过最大值。在构造函数中设置的位数?我也看到,构造函数'public BitSet(int nbits)'不包含局部变量来跟踪在构造函数中传递的位数...... – GeertVc

+1

@GeertVc您传递给'new BitSet N)'就像比特集的_estimated_大小,并用于分配内部比特存储。如果你设置了一个这样的大小,'BitSet'必须扩展内部存储来分配它,但是它仍然允许这样做。这一原理也被用在其他'java.util'集合类中。 'new ArrayList(10)'创建一个最初由大小为10的数组支持的列表,但如果需要,仍然允许添加多于10个元素来分配更大的数组。 – rrobby86

4

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

所以bitSet.set(9);翻转比特数9至11

在输出:

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

每指数为其中此BitSet在设置状态中包含一个位,该索引的十进制表示形式包含在结果中。小号

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

到字节:10 00101000

在2和40中的小数。

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 1 = 2)。

二进制00101000是十进制40(2 3 + 2 5 = 8 + 32 = 40)。

+0

2^9怎么样? – gstackoverflow

+0

@gstackoverflow一个字节是8位宽。所以2^9在第二个字节结束,所以在索引为1的字节中将会是00000010 => 2。 – Fildor

+0

aaaaa,谢谢。我明白 – gstackoverflow

相关问题