return false;
}
if (n > p)
- memset(&data[4 * p + 4], 0, (n - p) * 4);
+ memset(&data[p], 0, (n - p) * 4);
+ if (nBits < size && (nBits % 32))
+ data[(nBits + 31) / 32 - 1] &= (1 << (nBits % 32)) - 1;
size = nBits;
return true;
if (zero)
memset(data, 0, (size + 7) / 8);
else
- if (nBits)
- data[(size + 31) / 32 - 1] = 0; // clear unused bits (e.g. for popCount)
+ if (size % 32) // clear unused bits (e.g. for popCount)
+ data[(size + 31) / 32 - 1] &= (1 << (size % 32)) - 1;
return data;
}
unsigned int i;
for (i = 0; i < (size + 31) / 32; ++i)
data[i] = val;
- if (val)
- data[i] &= ~(0xffffffff << (size % 32)); // BE ?
+ if (val && i)
+ data[i - 1] &= (1 << (size % 32)) - 1;
}
void BitSet::setOr(BitSet *pA, BitSet *pB)
}
}
}
+
+ // If we couldn't find a position, we can have a left-over -1 in pos. Make
+ // sure to abort in such a case.
+ if (pos < 0)
+ return -1;
+
pos += i * 32;
return ((pos + count) <= size) ? pos : -1;