Java 为什么位集允许不同于1和0的值?

Java 为什么位集允许不同于1和0的值?,java,bitset,Java,Bitset,我试着学习java中的BitSetcollection。我已经读到它在内部使用位 位集的每个*组件都有一个{@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())); 我想知道我

我试着学习java中的
BitSet
collection。我已经读到它在内部使用位

位集的每个*组件都有一个{@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]
请向我解释此集合的用法?

将指定索引处的位设置为true

So
bitSet.set(9)将位号9翻转为1

关于输出:

  • System.out.println(位集)根据JavaDoc打印结果:
对于此位集包含处于集合状态的位的每个索引,该索引的十进制表示形式将包含在结果中。

  • Arrays.toString(bitSet.toByteArray())
    打印位集
它一步一步地拆分二进制集: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)。

位集
逻辑上表示“根据需要增长的位向量”()

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

使用
设置(x)
将位置x处的位设置为1(真)(其中第一个位置为0);e、 g.在代码中启用位3、5和9

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

toByteArray()
位集的内容转换为
字节
值序列,每个值包含8个连续位的值,以小尾端顺序排列(即从
位集中的最小索引开始)。示例中的输出
{40,2}
来自:

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

7 0 15 8无意冒犯-但我希望6k+用户知道如何查找oracle文档以获取集合类,阅读并理解它…@Fildor我在本页的引用,正如您所见,这并没有让它变得更好。你为什么不明白这些文件?我们怎样才能给你更多更好的解释呢?对我来说这很清楚。“我只是想知道为什么它不适合你。”菲尔多我读了《医生》,但不明白。我相信这对这种情况来说是很合适的,但如果你能确切地知道你在挣扎什么,那将是很有帮助的。否则,人们会或多或少地重复这些文档,这是您不理解的。@gstackoverflow一个字节的宽度是8位。因此,2^9在第二个字节中结束,因此在索引为1的字节中,这将是00000010=>2。@gstackoverflow,请添加注释,而不是直接修改用户答案,尤其是当您还不理解内容时:您删除了8和7之间的有意义的空格:附加问题:当我声明
位集位=新位集时(8) 
然后我就可以毫无问题地执行
位.set(15);
或检索
位.get(85);
(我知道这有点夸张,但只是为了说明这一点)。在
位集.java
中查看
公共无效集(int-bitIndex)
的实现时,我只看到索引为负时抛出的异常(足够公平)。但是,当您超过构造函数中设置的最大位数时,为什么不呢?我还看到构造函数
公共位集(int nbits)
没有保存本地变量来跟踪在构造函数中传递的位数…@GeertVc传递给
新位集(N)的N
类似于位集的估计大小,用于分配内部位存储。如果设置的位超过此大小,则
位集必须扩展内部存储以分配它,但它仍然允许这样做。这一原理也用于其他
java.util
集合类,例如
new ArrayList(10)
创建一个最初由大小为10的数组支持的列表,但仍然允许添加10个以上的元素,如有必要,分配一个更大的数组。
 7      0   15     8    <- position in BitSet
 |      |   |      |
{00101000 , 00000010}   <- toByteArray(), binary
    |          |
{  40     ,    2    }   <- toByteArray(), decimal