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 回答
BitSet
使用位来存储信息,如下所示:每当你使用
set(n)
时,它位于相应位置的 sets 位 . 底层的实现是一系列的长期 - 但是为了理解API,它足以将它想象成一个长的数组 - 零和一 - 如图所示 . 如果需要,它会扩展自己 .当需要在5之后寻找下一个清除位时,转到第5位,并开始搜索直到它达到零 . 实际上,实现速度要快得多,依赖于位操作技巧,但再次理解API,就是你可以想象它的方式 .
您的问题表明您可能认为
b.nextClearBit(i)
的结果以某种方式受到设置为true
或false
的不同位的顺序的影响 . 这是错误的,因为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
.BitSet
是一套 . 插入顺序无关紧要 . 该方法只给出下一个更高清除位的索引 .内部实施已在前一个问题中解释过 . 对于每种方法,您都可以检查来源 . (代码可能包含模糊的"bit bashing"(也可在
java.lang.Integer
/java.lang.Long
中使用,可以实现为内在函数) . )nextClearBit的javadoc说:
您已将5,6和9设置为true . 这意味着从5开始,第一个索引设置为false是7.从9开始,第一个索引设置为false是10.根据您自己的输出,它也是返回的 .
如果你想知道BitSet如何工作以及它做什么,请阅读它的Javadoc并查看源代码 . 它包含在JDK中 .