1

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

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

4

4 回答 4

2

的 javadocnextClearBit说:

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

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

如果您想知道它BitSet的工作原理和作用,请阅读它的 Javadoc 并查看源代码。它包含在 JDK 中。

于 2018-12-09T16:45:13.387 回答
1

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

         ╔═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╦╕
位:║ 0 ║ 1 ║ 0 ║ 0 ║ 1 ║ 1 ║ 0 ║ 0 ║ 0 ║ 0 ║ 0 ║
      ...╚═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══════╩═══╩╕
位置:10 9 8 7 6 5 4 3 2 1 0

无论何时使用set(n)- 它都会位设置在相应的位置。底层实现是一系列长整数 - 但为了理解 API,将其想象成一个长数组就足够了 - 零和一 - 就像在绘图中一样。如果需要,它会自行扩展。

当它需要在 5 之后寻找下一个清除位时,转到第 5 位,并开始搜索,直到它到达零。实际上,实现要快得多,依赖于位操作技巧,但同样,要了解 API,这就是您可以想象的方式。

于 2018-12-09T17:02:48.227 回答
0

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

next表示“按索引顺序排列的下一个”,而不是“按已分配值的顺序排列的下一个”

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

于 2018-12-09T17:02:56.153 回答
-1

BitSet是一个集合。(插入的)顺序无关紧要。该方法只给出下一个较高清除位的索引。

内部实现已在上一个问题中解释过。对于每种方法,您可以检查来源。(代码可能包含晦涩的“bit bashing”(也可以在java.lang.Integer/中获得java.lang.Long,可以作为内在函数实现)。)

于 2018-12-09T16:39:27.737 回答