Fixed issue where BitSet didn't handle a range of 64 bits correctly on bulk operations - now just return the predefined MASK which has all the bits set when requesting that all the bits be set.

This commit is contained in:
Mike Keesey 2012-07-06 23:33:05 -06:00
parent 9c9ee5c26d
commit 7947981b4b
2 changed files with 12 additions and 1 deletions

View File

@ -34,7 +34,11 @@ public class BitSet implements Serializable, Cloneable {
private static long getTrueMask(int fromIndex, int toIndex) {
int currentRange = toIndex - fromIndex;
return (((1L << currentRange) - 1L) << (fromIndex % BITS_PER_LONG));
if (currentRange == 64) {
return MASK;
} else {
return (((1L << currentRange) - 1L) << (fromIndex % BITS_PER_LONG));
}
}
public BitSet(int bitLength) {

View File

@ -96,6 +96,13 @@ public class BitsetTest {
assertTrue("bit 2 should be 0", !bitset.get(2));
assertTrue("bit 3 should be 1", bitset.get(3));
assertCardinality(bitset, 17);
bitset = new BitSet(70);
bitset.flip(0, 65);
for (int i=0; i < 65; ++i) {
assertTrue("bit " + i + " should be set", bitset.get(i));
}
assertTrue("bit 65 should not be set", !bitset.get(65));
}
static void assertTrue(String msg, boolean flag) {