首页 文章

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

提问于
浏览
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 回答

  • 0

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

    ╔═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╗
    Bits:    ║ 0 ║ 1 ║ 0 ║ 0 ║ 1 ║ 1 ║ 0 ║ 0 ║ 0 ║ 0 ║ 0 ║
          ...╚═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╝
    Position: 10   9   8   7   6   5   4   3   2   1   0
    

    每当你使用 set(n) 时,它位于相应位置的 sets 位 . 底层的实现是一系列的长期 - 但是为了理解API,它足以将它想象成一个长的数组 - 零和一 - 如图所示 . 如果需要,它会扩展自己 .

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

  • 1

    您的问题表明您可能认为 b.nextClearBit(i) 的结果以某种方式受到设置为 truefalse 的不同位的顺序的影响 . 这是错误的,因为 BitSet 不记得索引给定值的顺序 .

    next 表示"next in the order of the indices"而不是"next in the order of having been values assigned" .

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

  • 2

    BitSet 是一套 . 插入顺序无关紧要 . 该方法只给出下一个更高清除位的索引 .

    内部实施已在前一个问题中解释过 . 对于每种方法,您都可以检查来源 . (代码可能包含模糊的"bit bashing"(也可在 java.lang.Integer / java.lang.Long 中使用,可以实现为内在函数) . )

  • -1

    nextClearBit的javadoc说:

    返回在指定的起始索引之上或之后发生的设置为false的第一个位的索引 .

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

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

相关问题