Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Get all Indexes of the set bits in a BitSet

Tags:

java

bitset

I'm looking for a fast algorithm with gives me all the indexes of the set bits in a BitSet object. This is slow:

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);
}
...

Any help is appreciated!

like image 676
myborobudur Avatar asked Mar 13 '13 16:03

myborobudur


2 Answers

No need to use bitSet.cardinality() at all:

for (int i = bitSet.nextSetBit(0); i != -1; i = bitSet.nextSetBit(i + 1)) {
    indexes.add(i);
}
like image 174
Louis Wasserman Avatar answered Oct 04 '22 08:10

Louis Wasserman


As specified in 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
     }
 }
like image 42
Thamme Gowda Avatar answered Oct 04 '22 10:10

Thamme Gowda