java中位集的nextClearBit()实际上是如何工作的?

java中位集的nextClearBit()实际上是如何工作的?,java,bitset,Java,Bitset,BitSet类中的此方法用于返回设置为false的第一位的索引 import java.util.BitSet; public class BitSetDemo { public static void main(String[] args) { BitSet b = new BitSet(); b.set(5); b.set(9); b.set(6); System.out.println(""+b); System

BitSet类中的此方法用于返回设置为false的第一位的索引

import java.util.BitSet;
public class BitSetDemo {
   public static void main(String[] args) {
      BitSet b = new BitSet();
      b.set(5);
      b.set(9);
      b.set(6);
      System.out.println(""+b);
      System.out.println(b.nextClearBit(5));
      System.out.println(b.nextClearBit(9)); 
     }
   }
 Output :
 {5, 6, 9}
 7
 10

在这段代码中,9之后设置了6,但它表明值是连续存储的(b.nextClearBit(5)返回下一个值,即7)。那么,位集如何存储这些值呢?

BitSet
是一个集。插入顺序无关。该方法只给出下一个更高清晰位的索引

在前面的问题中已经解释了内部实现。对于每个方法,您都可以检查源代码。(代码可能包含模糊的“位碰撞”(也可以在
java.lang.Integer
/
java.lang.Long
中找到,可以作为内部实现)。

的javadoc说明:

返回在指定起始索引时或之后设置为
false
的第一位的索引

您已将5、6和9设置为true。这意味着从5开始,设置为false的第一个索引是7。从9开始,设置为false的第一个索引是10。根据您自己的输出,这也是返回的


如果您想知道它是如何工作的以及它是做什么的,请阅读它的Javadoc并查看源代码。它包含在JDK中。

位集
使用位存储信息,如下所示:

╔═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╗ Bits: ║ 0 ║ 1 ║ 0 ║ 0 ║ 1 ║ 1 ║ 0 ║ 0 ║ 0 ║ 0 ║ 0 ║ ...╚═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╝ Position: 10 9 8 7 6 5 4 3 2 1 0 ╔═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╗ 位:║ 0║ 1.║ 0║ 0║ 1.║ 1.║ 0║ 0║ 0║ 0║ 0║ ...╚═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╝ 职位:109876543210 无论何时使用
set(n)
,它都会将位设置在相应的位置。底层实现有一系列的long-但是为了理解API,就足以将其想象为一个长的位数组-0和1-就像在图形中一样。如果需要,它会扩展自身


当它需要查找5之后的下一个清晰位时,转到位号5,并开始搜索,直到它达到零。实际上,实现速度要快得多,依赖于位操作技巧,但同样,要理解API,这是您可以想象的。

您的问题表明您可能认为
b.nextClearBit(i)
在某种程度上受到设置为
true
false
的不同位的顺序的影响。 这是错误的,因为
位集
不记得索引给定值的顺序

next
表示“索引顺序中的下一个”,而不是“赋值顺序中的下一个”


b.nextClearBit(i)
返回大于或等于
i
的最小索引
j
,其中
b.get(i)=false

您查看了源代码了吗?有什么不清楚的地方吗?另外,根据您的输出,
nextClearBit(5)
的输出是7,正如预期的那样(而不是您所说的6).Oops抱歉,它是7。它会连续存储值吗?javadoc记录了它的行为,如果您想知道它是如何实现的,请查看源代码。请注意,它是否连续存储是无关的,因为API是根据位集的索引定义的,这意味着它的外部行为将被排序。对于e示例
toString
指定:“这些索引是按从低到高的顺序列出的”理解!谢谢!!
BitSet
是绝对有序的。它被编码在一个或多个long中,其中索引对应于其中一个long中的位。@markrotVeel
java.util.List
的描述是“有序集合”(也称为序列)。“它不是其中之一。它是按自然顺序排序的,但不是按任何可以更改的顺序排序的。我不知道你为什么要引用
java.util.List
BitSet
不是真正的集合类(它不是你似乎认为的
java.util.Set
):“此类实现了一个按需增长的位向量。位集的每个组件都有一个布尔值。位集的位由非负整数索引。”使用向量和非负整数索引(以及文档的其余部分)都清楚地表明了它的顺序(按位索引)。我想知道这些值是如何相互映射的。在这个位集中,值被给定为5,9,6,但实际上它存储为5,6,9。@vicky,这是因为的输出在javadoc中被指定为要排序的。同样,如果你想知道它是如何实际实现的:查看源代码。上次我查看时,它被编码为1或more longs所以5设置第六位,6设置第七位,9设置第一个long的第十位(索引0是第一位),等等。但这在不同版本的Java(或不同的供应商)中可能会有所不同。是的,我如你所说的那样想,但得到了。谢谢!