* Mask out the bits smaller than pos in the current unit.
* We are only interested in bits set higher than pos.
*/
- unsigned long curr_unit = bs->data[unit_number] & ~in_unit_mask;
+ unsigned long curr_unit = bs->data[unit_number];
- /* Find the next bit set in the unit. */
- unsigned long next_in_this_unit
- = _bitset_inside_ntz_value(set ? curr_unit : ~curr_unit);
+ /*
+ * Find the next bit set in the unit.
+ * Mind that this function returns 0, if the unit is -1 and
+ * counts the bits from 1 on.
+ */
+ unsigned long next_in_this_unit =
+ _bitset_inside_ntz_value((set ? curr_unit : ~curr_unit) & ~in_unit_mask);
/* If there is a bit set in the current unit, exit. */
if(next_in_this_unit < BS_UNIT_SIZE_BITS)
unsigned long i;
for(i = unit_number + 1; i < bs->units; ++i) {
unsigned long data = bs->data[i];
- unsigned long first_set = _bitset_inside_ntz_value(set ? data : ~data);
+ unsigned long first_set =
+ _bitset_inside_ntz_value(set ? data : ~data);
+
if(first_set < BS_UNIT_SIZE_BITS)
return first_set + i * BS_UNIT_SIZE_BITS;
}
#define bitset_foreach(bitset,elm) \
for(elm = bitset_next_set(bitset,0); elm != -1; elm = bitset_next_set(bitset,elm+1))
+
+#define bitset_foreach_clear(bitset,elm) \
+ for(elm = bitset_next_clear(bitset,0); elm != -1; elm = bitset_next_clear(bitset,elm+1))
+
/**
* Count the bits set.
* This can also be seen as the cardinality of the set.