获取BitSet中设置位的所有索引

时间:2013-03-13 16:07:47

标签: java bitset

我正在寻找一个快速算法,它给出了BitSet对象中设置位的所有索引。 这很慢:

BitSet bitSet = ...
Collection<Integer> indexes = new ArrayList<Integer>(bitSet.cardinality());
int nextSetBit = bitSet.nextSetBit(0);
for (int i = 0; i < bitSet.cardinality(); ++i ) {
    indexes.add(nextSetBit);
    nextSetBit = bitSet.nextSetBit(nextSetBit + 1);
}
...

任何帮助表示赞赏!

4 个答案:

答案 0 :(得分:15)

根本不需要使用bitSet.cardinality()

for (int i = bitSet.nextSetBit(0); i != -1; i = bitSet.nextSetBit(i + 1)) {
    indexes.add(i);
}

答案 1 :(得分:7)

BitSet#nextSetBit(int) javadocs中所述:

//To iterate over the true bits in a BitSet, use the following loop:
for (int i = bs.nextSetBit(0); i >= 0; i = bs.nextSetBit(i+1)) {
     // operate on index i here
     if (i == Integer.MAX_VALUE) {
         break; // or (i+1) would overflow
     }
 }

答案 2 :(得分:2)

从Java 8开始,您可以使用BitSet的stream()方法。

  

IntStream stream()

     

返回索引流,其中该BitSet包含处于设置状态的位。

答案 3 :(得分:-1)

更改循环(将复杂度增加到O(N ^ 2),因为在每次循环迭代中调用cardinality()):

for (int e = bitSet.cardinality(), i = 0; i < e; ++i ) {
    indexes.add(nextSetBit);
    nextSetBit = bitSet.nextSetBit(nextSetBit + 1);
}
相关问题