// // Copyright (C) 2010 United States Government as represented by the // Administrator of the National Aeronautics and Space Administration // (NASA). All Rights Reserved. // // This software is distributed under the NASA Open Source Agreement // (NOSA), version 1.3. The NOSA has been approved by the Open Source // Initiative. See the file NOSA-1.3-JPF at the top of the distribution // directory tree for the complete NOSA document. // // THE SUBJECT SOFTWARE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY OF ANY // KIND, EITHER EXPRESSED, IMPLIED, OR STATUTORY, INCLUDING, BUT NOT // LIMITED TO, ANY WARRANTY THAT THE SUBJECT SOFTWARE WILL CONFORM TO // SPECIFICATIONS, ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR // A PARTICULAR PURPOSE, OR FREEDOM FROM INFRINGEMENT, ANY WARRANTY THAT // THE SUBJECT SOFTWARE WILL BE ERROR FREE, OR ANY WARRANTY THAT // DOCUMENTATION, IF PROVIDED, WILL CONFORM TO THE SUBJECT SOFTWARE. // package gov.nasa.jpf.util; import gov.nasa.jpf.JPFException; /** * a fixed size BitSet with 1024 bits. * * The main motivation for this class is to minimize memory size while maximizing * performance and keeping a java.util.BitSet compatible interface. The only * deviation from the standard BitSet is that we assume more cardinality() calls * than set()/clear() calls, i.e. we want to cache this value * * Instances of this class do not allocate any additional memory, we keep all * data in builtin type fields */ public class BitSet1024 implements FixedBitSet, Cloneable { public static final int INDEX_MASK = 0xfffffc00; long l0, l1, l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12, l13, l14, l15; int cardinality; public BitSet1024 (){ // nothing in here } public BitSet1024 (int i){ set(i); } public BitSet1024 (int... idx){ for (int i : idx){ set(i); } } public int longSize(){ return 4; } public long getLong(int i){ switch (i){ case 0: return l0; case 1: return l1; case 2: return l2; case 3: return l3; case 4: return l4; case 5: return l5; case 6: return l6; case 7: return l7; case 8: return l8; case 9: return l9; case 10: return l10; case 11: return l11; case 12: return l12; case 13: return l13; case 14: return l14; case 15: return l15; default: throw new IndexOutOfBoundsException("BitSet1022 has no long index " + i); } } public BitSet1024 clone() { try { return (BitSet1024) super.clone(); } catch (CloneNotSupportedException ex) { throw new JPFException("BitSet1024 clone failed"); } } private final int computeCardinality (){ int n= Long.bitCount(l0); n += Long.bitCount(l1); n += Long.bitCount(l2); n += Long.bitCount(l3); n += Long.bitCount(l4); n += Long.bitCount(l5); n += Long.bitCount(l6); n += Long.bitCount(l7); n += Long.bitCount(l8); n += Long.bitCount(l9); n += Long.bitCount(l10); n += Long.bitCount(l11); n += Long.bitCount(l12); n += Long.bitCount(l13); n += Long.bitCount(l14); n += Long.bitCount(l15); return n; } //--- public interface (much like java.util.BitSet) public void set (int i){ if ((i & INDEX_MASK) == 0) { long bitPattern = (1L << i); switch (i >> 6) { case 0: if ((l0 & bitPattern) == 0L) { cardinality++; l0 |= bitPattern; } break; case 1: if ((l1 & bitPattern) == 0L) { cardinality++; l1 |= bitPattern; } break; case 2: if ((l2 & bitPattern) == 0L) { cardinality++; l2 |= bitPattern; } break; case 3: if ((l3 & bitPattern) == 0L) { cardinality++; l3 |= bitPattern; } break; case 4: if ((l4 & bitPattern) == 0L) { cardinality++; l4 |= bitPattern; } break; case 5: if ((l5 & bitPattern) == 0L) { cardinality++; l5 |= bitPattern; } break; case 6: if ((l6 & bitPattern) == 0L) { cardinality++; l6 |= bitPattern; } break; case 7: if ((l7 & bitPattern) == 0L) { cardinality++; l7 |= bitPattern; } break; case 8: if ((l8 & bitPattern) == 0L) { cardinality++; l8 |= bitPattern; } break; case 9: if ((l9 & bitPattern) == 0L) { cardinality++; l9 |= bitPattern; } break; case 10: if ((l10 & bitPattern) == 0L) { cardinality++; l10 |= bitPattern; } break; case 11: if ((l11 & bitPattern) == 0L) { cardinality++; l11 |= bitPattern; } break; case 12: if ((l12 & bitPattern) == 0L) { cardinality++; l12 |= bitPattern; } break; case 13: if ((l13 & bitPattern) == 0L) { cardinality++; l13 |= bitPattern; } break; case 14: if ((l14 & bitPattern) == 0L) { cardinality++; l14 |= bitPattern; } break; case 15: if ((l15 & bitPattern) == 0L) { cardinality++; l15 |= bitPattern; } } } else { throw new IndexOutOfBoundsException("BitSet1024 index out of range: " + i); } } public void clear (int i){ if ((i & INDEX_MASK) == 0) { long bitPattern = (1L << i); switch (i >> 6) { case 0: if ((l0 & bitPattern) != 0L) { cardinality--; l0 &= ~bitPattern; } break; case 1: if ((l1 & bitPattern) != 0L) { cardinality--; l1 &= ~bitPattern; } break; case 2: if ((l2 & bitPattern) != 0L) { cardinality--; l2 &= ~bitPattern; } break; case 3: if ((l3 & bitPattern) != 0L) { cardinality--; l3 &= ~bitPattern; } case 4: if ((l4 & bitPattern) != 0L) { cardinality--; l4 &= ~bitPattern; } break; case 5: if ((l5 & bitPattern) != 0L) { cardinality--; l5 &= ~bitPattern; } break; case 6: if ((l6 & bitPattern) != 0L) { cardinality--; l6 &= ~bitPattern; } break; case 7: if ((l7 & bitPattern) != 0L) { cardinality--; l7 &= ~bitPattern; } break; case 8: if ((l8 & bitPattern) != 0L) { cardinality--; l8 &= ~bitPattern; } break; case 9: if ((l9 & bitPattern) != 0L) { cardinality--; l9 &= ~bitPattern; } break; case 10: if ((l10 & bitPattern) != 0L) { cardinality--; l10 &= ~bitPattern; } break; case 11: if ((l11 & bitPattern) != 0L) { cardinality--; l11 &= ~bitPattern; } break; case 12: if ((l12 & bitPattern) != 0L) { cardinality--; l12 &= ~bitPattern; } break; case 13: if ((l13 & bitPattern) != 0L) { cardinality--; l13 &= ~bitPattern; } break; case 14: if ((l14 & bitPattern) != 0L) { cardinality--; l14 &= ~bitPattern; } break; case 15: if ((l15 & bitPattern) != 0L) { cardinality--; l15 &= ~bitPattern; } } } else { throw new IndexOutOfBoundsException("BitSet1024 index out of range: " + i); } } public void set (int i, boolean val){ if (val) { set(i); } else { clear(i); } } public boolean get (int i){ if ((i & INDEX_MASK) == 0) { long bitPattern = (1L << i); switch (i >> 6) { case 0: return ((l0 & bitPattern) != 0); case 1: return ((l1 & bitPattern) != 0); case 2: return ((l2 & bitPattern) != 0); case 3: return ((l3 & bitPattern) != 0); case 4: return ((l4 & bitPattern) != 0); case 5: return ((l5 & bitPattern) != 0); case 6: return ((l6 & bitPattern) != 0); case 7: return ((l7 & bitPattern) != 0); case 8: return ((l8 & bitPattern) != 0); case 9: return ((l9 & bitPattern) != 0); case 10: return ((l10 & bitPattern) != 0); case 11: return ((l11 & bitPattern) != 0); case 12: return ((l12 & bitPattern) != 0); case 13: return ((l13 & bitPattern) != 0); case 14: return ((l14 & bitPattern) != 0); case 15: return ((l15 & bitPattern) != 0); } } throw new IndexOutOfBoundsException("BitSet1024 index out of range: " + i); } public int cardinality() { return cardinality; } public int size() { return cardinality; } /** * number of bits we can store */ public int capacity() { return 1024; } /** * index of highest set bit + 1 */ public int length() { if (l15 != 0){ return 1024 - Long.numberOfLeadingZeros(l15); } else if (l14 != 0) { return 960 - Long.numberOfLeadingZeros(l14); } else if (l13 != 0) { return 896 - Long.numberOfLeadingZeros(l13); } else if (l12 != 0) { return 832 - Long.numberOfLeadingZeros(l12); } else if (l11 != 0) { return 768 - Long.numberOfLeadingZeros(l11); } else if (l10 != 0) { return 704 - Long.numberOfLeadingZeros(l10); } else if (l9 != 0) { return 640 - Long.numberOfLeadingZeros(l9); } else if (l8 != 0) { return 576 - Long.numberOfLeadingZeros(l8); } else if (l7 != 0) { return 512 - Long.numberOfLeadingZeros(l7); } else if (l6 != 0) { return 448 - Long.numberOfLeadingZeros(l6); } else if (l5 != 0) { return 384 - Long.numberOfLeadingZeros(l5); } else if (l4 != 0) { return 320 - Long.numberOfLeadingZeros(l4); } else if (l3 != 0){ return 256 - Long.numberOfLeadingZeros(l3); } else if (l2 != 0){ return 192 - Long.numberOfLeadingZeros(l2); } else if (l1 != 0){ return 128 - Long.numberOfLeadingZeros(l1); } else if (l1 != 0){ return 64 - Long.numberOfLeadingZeros(l0); } else { return 0; } } public boolean isEmpty() { return (cardinality == 0); } public void clear() { l0 = l1 = l2 = l3 = l4 = l5 = l6 = l7 = l8 = l9= l10 = l11 = l12 = l13 = l14 = l15 =0L; cardinality = 0; } public int nextSetBit (int fromIdx){ if ((fromIdx & INDEX_MASK) == 0) { int i; int i0 = fromIdx & 0x3f; switch (fromIdx >> 6){ case 0: if ((i=Long.numberOfTrailingZeros(l0 & (0xffffffffffffffffL << i0))) <64) return i; if ((i=Long.numberOfTrailingZeros(l1)) <64) return i + 64; if ((i=Long.numberOfTrailingZeros(l2)) <64) return i + 128; if ((i=Long.numberOfTrailingZeros(l3)) <64) return i + 192; if ((i=Long.numberOfTrailingZeros(l4)) <64) return i + 256; if ((i=Long.numberOfTrailingZeros(l5)) <64) return i + 320; if ((i=Long.numberOfTrailingZeros(l6)) <64) return i + 384; if ((i=Long.numberOfTrailingZeros(l7)) <64) return i + 448; if ((i=Long.numberOfTrailingZeros(l8)) <64) return i + 512; if ((i=Long.numberOfTrailingZeros(l9)) <64) return i + 576; if ((i=Long.numberOfTrailingZeros(l10)) <64) return i + 640; if ((i=Long.numberOfTrailingZeros(l11)) <64) return i + 704; if ((i=Long.numberOfTrailingZeros(l12)) <64) return i + 768; if ((i=Long.numberOfTrailingZeros(l13)) <64) return i + 832; if ((i=Long.numberOfTrailingZeros(l14)) <64) return i + 896; if ((i=Long.numberOfTrailingZeros(l15)) <64) return i + 960; break; case 1: if ((i=Long.numberOfTrailingZeros(l1 & (0xffffffffffffffffL << i0))) <64) return i + 64; if ((i=Long.numberOfTrailingZeros(l2)) <64) return i + 128; if ((i=Long.numberOfTrailingZeros(l3)) <64) return i + 192; if ((i=Long.numberOfTrailingZeros(l4)) <64) return i + 256; if ((i=Long.numberOfTrailingZeros(l5)) <64) return i + 320; if ((i=Long.numberOfTrailingZeros(l6)) <64) return i + 384; if ((i=Long.numberOfTrailingZeros(l7)) <64) return i + 448; if ((i=Long.numberOfTrailingZeros(l8)) <64) return i + 512; if ((i=Long.numberOfTrailingZeros(l9)) <64) return i + 576; if ((i=Long.numberOfTrailingZeros(l10)) <64) return i + 640; if ((i=Long.numberOfTrailingZeros(l11)) <64) return i + 704; if ((i=Long.numberOfTrailingZeros(l12)) <64) return i + 768; if ((i=Long.numberOfTrailingZeros(l13)) <64) return i + 832; if ((i=Long.numberOfTrailingZeros(l14)) <64) return i + 896; if ((i=Long.numberOfTrailingZeros(l15)) <64) return i + 960; break; case 2: if ((i=Long.numberOfTrailingZeros(l2 & (0xffffffffffffffffL << i0))) <64) return i + 128; if ((i=Long.numberOfTrailingZeros(l3)) <64) return i + 192; if ((i=Long.numberOfTrailingZeros(l4)) <64) return i + 256; if ((i=Long.numberOfTrailingZeros(l5)) <64) return i + 320; if ((i=Long.numberOfTrailingZeros(l6)) <64) return i + 384; if ((i=Long.numberOfTrailingZeros(l7)) <64) return i + 448; if ((i=Long.numberOfTrailingZeros(l8)) <64) return i + 512; if ((i=Long.numberOfTrailingZeros(l9)) <64) return i + 576; if ((i=Long.numberOfTrailingZeros(l10)) <64) return i + 640; if ((i=Long.numberOfTrailingZeros(l11)) <64) return i + 704; if ((i=Long.numberOfTrailingZeros(l12)) <64) return i + 768; if ((i=Long.numberOfTrailingZeros(l13)) <64) return i + 832; if ((i=Long.numberOfTrailingZeros(l14)) <64) return i + 896; if ((i=Long.numberOfTrailingZeros(l15)) <64) return i + 960; break; case 3: if ((i=Long.numberOfTrailingZeros(l3 & (0xffffffffffffffffL << i0))) <64) return i + 192; if ((i=Long.numberOfTrailingZeros(l4)) <64) return i + 256; if ((i=Long.numberOfTrailingZeros(l5)) <64) return i + 320; if ((i=Long.numberOfTrailingZeros(l6)) <64) return i + 384; if ((i=Long.numberOfTrailingZeros(l7)) <64) return i + 448; if ((i=Long.numberOfTrailingZeros(l8)) <64) return i + 512; if ((i=Long.numberOfTrailingZeros(l9)) <64) return i + 576; if ((i=Long.numberOfTrailingZeros(l10)) <64) return i + 640; if ((i=Long.numberOfTrailingZeros(l11)) <64) return i + 704; if ((i=Long.numberOfTrailingZeros(l12)) <64) return i + 768; if ((i=Long.numberOfTrailingZeros(l13)) <64) return i + 832; if ((i=Long.numberOfTrailingZeros(l14)) <64) return i + 896; if ((i=Long.numberOfTrailingZeros(l15)) <64) return i + 960; break; case 4: if ((i=Long.numberOfTrailingZeros(l4 & (0xffffffffffffffffL << i0))) <64) return i + 256; if ((i=Long.numberOfTrailingZeros(l5)) <64) return i + 320; if ((i=Long.numberOfTrailingZeros(l6)) <64) return i + 384; if ((i=Long.numberOfTrailingZeros(l7)) <64) return i + 448; if ((i=Long.numberOfTrailingZeros(l8)) <64) return i + 512; if ((i=Long.numberOfTrailingZeros(l9)) <64) return i + 576; if ((i=Long.numberOfTrailingZeros(l10)) <64) return i + 640; if ((i=Long.numberOfTrailingZeros(l11)) <64) return i + 704; if ((i=Long.numberOfTrailingZeros(l12)) <64) return i + 768; if ((i=Long.numberOfTrailingZeros(l13)) <64) return i + 832; if ((i=Long.numberOfTrailingZeros(l14)) <64) return i + 896; if ((i=Long.numberOfTrailingZeros(l15)) <64) return i + 960; break; case 5: if ((i=Long.numberOfTrailingZeros(l5 & (0xffffffffffffffffL << i0))) <64) return i + 320; if ((i=Long.numberOfTrailingZeros(l6)) <64) return i + 384; if ((i=Long.numberOfTrailingZeros(l7)) <64) return i + 448; if ((i=Long.numberOfTrailingZeros(l8)) <64) return i + 512; if ((i=Long.numberOfTrailingZeros(l9)) <64) return i + 576; if ((i=Long.numberOfTrailingZeros(l10)) <64) return i + 640; if ((i=Long.numberOfTrailingZeros(l11)) <64) return i + 704; if ((i=Long.numberOfTrailingZeros(l12)) <64) return i + 768; if ((i=Long.numberOfTrailingZeros(l13)) <64) return i + 832; if ((i=Long.numberOfTrailingZeros(l14)) <64) return i + 896; if ((i=Long.numberOfTrailingZeros(l15)) <64) return i + 960; break; case 6: if ((i=Long.numberOfTrailingZeros(l6 & (0xffffffffffffffffL << i0))) <64) return i + 384; if ((i=Long.numberOfTrailingZeros(l7)) <64) return i + 448; if ((i=Long.numberOfTrailingZeros(l8)) <64) return i + 512; if ((i=Long.numberOfTrailingZeros(l9)) <64) return i + 576; if ((i=Long.numberOfTrailingZeros(l10)) <64) return i + 640; if ((i=Long.numberOfTrailingZeros(l11)) <64) return i + 704; if ((i=Long.numberOfTrailingZeros(l12)) <64) return i + 768; if ((i=Long.numberOfTrailingZeros(l13)) <64) return i + 832; if ((i=Long.numberOfTrailingZeros(l14)) <64) return i + 896; if ((i=Long.numberOfTrailingZeros(l15)) <64) return i + 960; break; case 7: if ((i=Long.numberOfTrailingZeros(l7 & (0xffffffffffffffffL << i0))) <64) return i + 448; if ((i=Long.numberOfTrailingZeros(l8)) <64) return i + 512; if ((i=Long.numberOfTrailingZeros(l9)) <64) return i + 576; if ((i=Long.numberOfTrailingZeros(l10)) <64) return i + 640; if ((i=Long.numberOfTrailingZeros(l11)) <64) return i + 704; if ((i=Long.numberOfTrailingZeros(l12)) <64) return i + 768; if ((i=Long.numberOfTrailingZeros(l13)) <64) return i + 832; if ((i=Long.numberOfTrailingZeros(l14)) <64) return i + 896; if ((i=Long.numberOfTrailingZeros(l15)) <64) return i + 960; break; case 8: if ((i=Long.numberOfTrailingZeros(l8 & (0xffffffffffffffffL << i0))) <64) return i + 512; if ((i=Long.numberOfTrailingZeros(l9)) <64) return i + 576; if ((i=Long.numberOfTrailingZeros(l10)) <64) return i + 640; if ((i=Long.numberOfTrailingZeros(l11)) <64) return i + 704; if ((i=Long.numberOfTrailingZeros(l12)) <64) return i + 768; if ((i=Long.numberOfTrailingZeros(l13)) <64) return i + 832; if ((i=Long.numberOfTrailingZeros(l14)) <64) return i + 896; if ((i=Long.numberOfTrailingZeros(l15)) <64) return i + 960; break; case 9: if ((i=Long.numberOfTrailingZeros(l9 & (0xffffffffffffffffL << i0))) <64) return i + 576; if ((i=Long.numberOfTrailingZeros(l10)) <64) return i + 640; if ((i=Long.numberOfTrailingZeros(l11)) <64) return i + 704; if ((i=Long.numberOfTrailingZeros(l12)) <64) return i + 768; if ((i=Long.numberOfTrailingZeros(l13)) <64) return i + 832; if ((i=Long.numberOfTrailingZeros(l14)) <64) return i + 896; if ((i=Long.numberOfTrailingZeros(l15)) <64) return i + 960; break; case 10: if ((i=Long.numberOfTrailingZeros(l10 & (0xffffffffffffffffL << i0))) <64) return i + 640; if ((i=Long.numberOfTrailingZeros(l11)) <64) return i + 704; if ((i=Long.numberOfTrailingZeros(l12)) <64) return i + 768; if ((i=Long.numberOfTrailingZeros(l13)) <64) return i + 832; if ((i=Long.numberOfTrailingZeros(l14)) <64) return i + 896; if ((i=Long.numberOfTrailingZeros(l15)) <64) return i + 960; break; case 11: if ((i=Long.numberOfTrailingZeros(l11 & (0xffffffffffffffffL << i0))) <64) return i + 704; if ((i=Long.numberOfTrailingZeros(l12)) <64) return i + 768; if ((i=Long.numberOfTrailingZeros(l13)) <64) return i + 832; if ((i=Long.numberOfTrailingZeros(l14)) <64) return i + 896; if ((i=Long.numberOfTrailingZeros(l15)) <64) return i + 960; break; case 12: if ((i=Long.numberOfTrailingZeros(l12 & (0xffffffffffffffffL << i0))) <64) return i + 768; if ((i=Long.numberOfTrailingZeros(l13)) <64) return i + 832; if ((i=Long.numberOfTrailingZeros(l14)) <64) return i + 896; if ((i=Long.numberOfTrailingZeros(l15)) <64) return i + 960; break; case 13: if ((i=Long.numberOfTrailingZeros(l13 & (0xffffffffffffffffL << i0))) <64) return i + 832; if ((i=Long.numberOfTrailingZeros(l14)) <64) return i + 896; if ((i=Long.numberOfTrailingZeros(l15)) <64) return i + 960; break; case 14: if ((i=Long.numberOfTrailingZeros(l14 & (0xffffffffffffffffL << i0))) <64) return i + 896; if ((i=Long.numberOfTrailingZeros(l15)) <64) return i + 960; break; case 15: if ((i=Long.numberOfTrailingZeros(l15 & (0xffffffffffffffffL << i0))) <64) return i + 960; break; } return -1; } return -1; } public int nextClearBit (int fromIdx){ if ((fromIdx & INDEX_MASK) == 0) { int i; int i0 = fromIdx & 0x3f; switch (fromIdx >> 6){ case 0: if ((i=Long.numberOfTrailingZeros(~l0 & (0xffffffffffffffffL << i0))) <64) return i; if ((i=Long.numberOfTrailingZeros(~l1)) <64) return i + 64; if ((i=Long.numberOfTrailingZeros(~l2)) <64) return i + 128; if ((i=Long.numberOfTrailingZeros(~l3)) <64) return i + 192; if ((i=Long.numberOfTrailingZeros(~l4)) <64) return i + 256; if ((i=Long.numberOfTrailingZeros(~l5)) <64) return i + 320; if ((i=Long.numberOfTrailingZeros(~l6)) <64) return i + 384; if ((i=Long.numberOfTrailingZeros(~l7)) <64) return i + 448; if ((i=Long.numberOfTrailingZeros(~l8)) <64) return i + 512; if ((i=Long.numberOfTrailingZeros(~l9)) <64) return i + 576; if ((i=Long.numberOfTrailingZeros(~l10)) <64) return i + 640; if ((i=Long.numberOfTrailingZeros(~l11)) <64) return i + 704; if ((i=Long.numberOfTrailingZeros(~l12)) <64) return i + 768; if ((i=Long.numberOfTrailingZeros(~l13)) <64) return i + 832; if ((i=Long.numberOfTrailingZeros(~l14)) <64) return i + 896; if ((i=Long.numberOfTrailingZeros(~l15)) <64) return i + 960; break; case 1: if ((i=Long.numberOfTrailingZeros(~l1 & (0xffffffffffffffffL << i0))) <64) return i + 64; if ((i=Long.numberOfTrailingZeros(~l2)) <64) return i + 128; if ((i=Long.numberOfTrailingZeros(~l3)) <64) return i + 192; if ((i=Long.numberOfTrailingZeros(~l4)) <64) return i + 256; if ((i=Long.numberOfTrailingZeros(~l5)) <64) return i + 320; if ((i=Long.numberOfTrailingZeros(~l6)) <64) return i + 384; if ((i=Long.numberOfTrailingZeros(~l7)) <64) return i + 448; if ((i=Long.numberOfTrailingZeros(~l8)) <64) return i + 512; if ((i=Long.numberOfTrailingZeros(~l9)) <64) return i + 576; if ((i=Long.numberOfTrailingZeros(~l10)) <64) return i + 640; if ((i=Long.numberOfTrailingZeros(~l11)) <64) return i + 704; if ((i=Long.numberOfTrailingZeros(~l12)) <64) return i + 768; if ((i=Long.numberOfTrailingZeros(~l13)) <64) return i + 832; if ((i=Long.numberOfTrailingZeros(~l14)) <64) return i + 896; if ((i=Long.numberOfTrailingZeros(~l15)) <64) return i + 960; break; case 2: if ((i=Long.numberOfTrailingZeros(~l2 & (0xffffffffffffffffL << i0))) <64) return i + 128; if ((i=Long.numberOfTrailingZeros(~l3)) <64) return i + 192; if ((i=Long.numberOfTrailingZeros(~l4)) <64) return i + 256; if ((i=Long.numberOfTrailingZeros(~l5)) <64) return i + 320; if ((i=Long.numberOfTrailingZeros(~l6)) <64) return i + 384; if ((i=Long.numberOfTrailingZeros(~l7)) <64) return i + 448; if ((i=Long.numberOfTrailingZeros(~l8)) <64) return i + 512; if ((i=Long.numberOfTrailingZeros(~l9)) <64) return i + 576; if ((i=Long.numberOfTrailingZeros(~l10)) <64) return i + 640; if ((i=Long.numberOfTrailingZeros(~l11)) <64) return i + 704; if ((i=Long.numberOfTrailingZeros(~l12)) <64) return i + 768; if ((i=Long.numberOfTrailingZeros(~l13)) <64) return i + 832; if ((i=Long.numberOfTrailingZeros(~l14)) <64) return i + 896; if ((i=Long.numberOfTrailingZeros(~l15)) <64) return i + 960; break; case 3: if ((i=Long.numberOfTrailingZeros(~l3 & (0xffffffffffffffffL << i0))) <64) return i + 192; if ((i=Long.numberOfTrailingZeros(~l4)) <64) return i + 256; if ((i=Long.numberOfTrailingZeros(~l5)) <64) return i + 320; if ((i=Long.numberOfTrailingZeros(~l6)) <64) return i + 384; if ((i=Long.numberOfTrailingZeros(~l7)) <64) return i + 448; if ((i=Long.numberOfTrailingZeros(~l8)) <64) return i + 512; if ((i=Long.numberOfTrailingZeros(~l9)) <64) return i + 576; if ((i=Long.numberOfTrailingZeros(~l10)) <64) return i + 640; if ((i=Long.numberOfTrailingZeros(~l11)) <64) return i + 704; if ((i=Long.numberOfTrailingZeros(~l12)) <64) return i + 768; if ((i=Long.numberOfTrailingZeros(~l13)) <64) return i + 832; if ((i=Long.numberOfTrailingZeros(~l14)) <64) return i + 896; if ((i=Long.numberOfTrailingZeros(~l15)) <64) return i + 960; break; case 4: if ((i=Long.numberOfTrailingZeros(~l4 & (0xffffffffffffffffL << i0))) <64) return i + 256; if ((i=Long.numberOfTrailingZeros(~l5)) <64) return i + 320; if ((i=Long.numberOfTrailingZeros(~l6)) <64) return i + 384; if ((i=Long.numberOfTrailingZeros(~l7)) <64) return i + 448; if ((i=Long.numberOfTrailingZeros(~l8)) <64) return i + 512; if ((i=Long.numberOfTrailingZeros(~l9)) <64) return i + 576; if ((i=Long.numberOfTrailingZeros(~l10)) <64) return i + 640; if ((i=Long.numberOfTrailingZeros(~l11)) <64) return i + 704; if ((i=Long.numberOfTrailingZeros(~l12)) <64) return i + 768; if ((i=Long.numberOfTrailingZeros(~l13)) <64) return i + 832; if ((i=Long.numberOfTrailingZeros(~l14)) <64) return i + 896; if ((i=Long.numberOfTrailingZeros(~l15)) <64) return i + 960; break; case 5: if ((i=Long.numberOfTrailingZeros(~l5 & (0xffffffffffffffffL << i0))) <64) return i + 320; if ((i=Long.numberOfTrailingZeros(~l6)) <64) return i + 384; if ((i=Long.numberOfTrailingZeros(~l7)) <64) return i + 448; if ((i=Long.numberOfTrailingZeros(~l8)) <64) return i + 512; if ((i=Long.numberOfTrailingZeros(~l9)) <64) return i + 576; if ((i=Long.numberOfTrailingZeros(~l10)) <64) return i + 640; if ((i=Long.numberOfTrailingZeros(~l11)) <64) return i + 704; if ((i=Long.numberOfTrailingZeros(~l12)) <64) return i + 768; if ((i=Long.numberOfTrailingZeros(~l13)) <64) return i + 832; if ((i=Long.numberOfTrailingZeros(~l14)) <64) return i + 896; if ((i=Long.numberOfTrailingZeros(~l15)) <64) return i + 960; break; case 6: if ((i=Long.numberOfTrailingZeros(~l6 & (0xffffffffffffffffL << i0))) <64) return i + 384; if ((i=Long.numberOfTrailingZeros(~l7)) <64) return i + 448; if ((i=Long.numberOfTrailingZeros(~l8)) <64) return i + 512; if ((i=Long.numberOfTrailingZeros(~l9)) <64) return i + 576; if ((i=Long.numberOfTrailingZeros(~l10)) <64) return i + 640; if ((i=Long.numberOfTrailingZeros(~l11)) <64) return i + 704; if ((i=Long.numberOfTrailingZeros(~l12)) <64) return i + 768; if ((i=Long.numberOfTrailingZeros(~l13)) <64) return i + 832; if ((i=Long.numberOfTrailingZeros(~l14)) <64) return i + 896; if ((i=Long.numberOfTrailingZeros(~l15)) <64) return i + 960; break; case 7: if ((i=Long.numberOfTrailingZeros(~l7 & (0xffffffffffffffffL << i0))) <64) return i + 448; if ((i=Long.numberOfTrailingZeros(~l8)) <64) return i + 512; if ((i=Long.numberOfTrailingZeros(~l9)) <64) return i + 576; if ((i=Long.numberOfTrailingZeros(~l10)) <64) return i + 640; if ((i=Long.numberOfTrailingZeros(~l11)) <64) return i + 704; if ((i=Long.numberOfTrailingZeros(~l12)) <64) return i + 768; if ((i=Long.numberOfTrailingZeros(~l13)) <64) return i + 832; if ((i=Long.numberOfTrailingZeros(~l14)) <64) return i + 896; if ((i=Long.numberOfTrailingZeros(~l15)) <64) return i + 960; break; case 8: if ((i=Long.numberOfTrailingZeros(~l8 & (0xffffffffffffffffL << i0))) <64) return i + 512; if ((i=Long.numberOfTrailingZeros(~l9)) <64) return i + 576; if ((i=Long.numberOfTrailingZeros(~l10)) <64) return i + 640; if ((i=Long.numberOfTrailingZeros(~l11)) <64) return i + 704; if ((i=Long.numberOfTrailingZeros(~l12)) <64) return i + 768; if ((i=Long.numberOfTrailingZeros(~l13)) <64) return i + 832; if ((i=Long.numberOfTrailingZeros(~l14)) <64) return i + 896; if ((i=Long.numberOfTrailingZeros(~l15)) <64) return i + 960; break; case 9: if ((i=Long.numberOfTrailingZeros(~l9 & (0xffffffffffffffffL << i0))) <64) return i + 576; if ((i=Long.numberOfTrailingZeros(~l10)) <64) return i + 640; if ((i=Long.numberOfTrailingZeros(~l11)) <64) return i + 704; if ((i=Long.numberOfTrailingZeros(~l12)) <64) return i + 768; if ((i=Long.numberOfTrailingZeros(~l13)) <64) return i + 832; if ((i=Long.numberOfTrailingZeros(~l14)) <64) return i + 896; if ((i=Long.numberOfTrailingZeros(~l15)) <64) return i + 960; break; case 10: if ((i=Long.numberOfTrailingZeros(~l10 & (0xffffffffffffffffL << i0))) <64) return i + 640; if ((i=Long.numberOfTrailingZeros(~l11)) <64) return i + 704; if ((i=Long.numberOfTrailingZeros(~l12)) <64) return i + 768; if ((i=Long.numberOfTrailingZeros(~l13)) <64) return i + 832; if ((i=Long.numberOfTrailingZeros(~l14)) <64) return i + 896; if ((i=Long.numberOfTrailingZeros(~l15)) <64) return i + 960; break; case 11: if ((i=Long.numberOfTrailingZeros(~l11 & (0xffffffffffffffffL << i0))) <64) return i + 704; if ((i=Long.numberOfTrailingZeros(~l12)) <64) return i + 768; if ((i=Long.numberOfTrailingZeros(~l13)) <64) return i + 832; if ((i=Long.numberOfTrailingZeros(~l14)) <64) return i + 896; if ((i=Long.numberOfTrailingZeros(~l15)) <64) return i + 960; break; case 12: if ((i=Long.numberOfTrailingZeros(~l12 & (0xffffffffffffffffL << i0))) <64) return i + 768; if ((i=Long.numberOfTrailingZeros(~l13)) <64) return i + 832; if ((i=Long.numberOfTrailingZeros(~l14)) <64) return i + 896; if ((i=Long.numberOfTrailingZeros(~l15)) <64) return i + 960; break; case 13: if ((i=Long.numberOfTrailingZeros(~l13 & (0xffffffffffffffffL << i0))) <64) return i + 832; if ((i=Long.numberOfTrailingZeros(~l14)) <64) return i + 896; if ((i=Long.numberOfTrailingZeros(~l15)) <64) return i + 960; break; case 14: if ((i=Long.numberOfTrailingZeros(~l14 & (0xffffffffffffffffL << i0))) <64) return i + 896; if ((i=Long.numberOfTrailingZeros(~l15)) <64) return i + 960; break; case 15: if ((i=Long.numberOfTrailingZeros(~l15 & (0xffffffffffffffffL << i0))) <64) return i + 960; break; } return -1; } else { //throw new IndexOutOfBoundsException("BitSet256 index out of range: " + fromIdx); return -1; } } public void and (BitSet1024 other){ l0 &= other.l0; l1 &= other.l1; l2 &= other.l2; l3 &= other.l3; l4 &= other.l4; l5 &= other.l5; l6 &= other.l6; l7 &= other.l7; l8 &= other.l8; l9 &= other.l9; l10 &= other.l10; l11 &= other.l11; l12 &= other.l12; l13 &= other.l13; l14 &= other.l14; l15 &= other.l15; cardinality = computeCardinality(); } public void andNot (BitSet1024 other){ l0 &= ~other.l0; l1 &= ~other.l1; l2 &= ~other.l2; l3 &= ~other.l3; l4 &= ~other.l4; l5 &= ~other.l5; l6 &= ~other.l6; l7 &= ~other.l7; l8 &= ~other.l8; l9 &= ~other.l9; l10 &= ~other.l10; l11 &= ~other.l11; l12 &= ~other.l12; l13 &= ~other.l13; l14 &= ~other.l14; l15 &= ~other.l15; cardinality = computeCardinality(); } public void or (BitSet1024 other){ l0 |= other.l0; l1 |= other.l1; l2 |= other.l2; l3 |= other.l3; l4 |= other.l4; l5 |= other.l5; l6 |= other.l6; l7 |= other.l7; l8 |= other.l8; l9 |= other.l9; l10 |= other.l10; l11 |= other.l11; l12 |= other.l12; l13 |= other.l13; l14 |= other.l14; l15 |= other.l15; cardinality = computeCardinality(); } public boolean equals (Object o){ if (o instanceof BitSet1024){ BitSet1024 other = (BitSet1024)o; if (l0 != other.l0) return false; if (l1 != other.l1) return false; if (l2 != other.l2) return false; if (l3 != other.l3) return false; if (l4 != other.l4) return false; if (l5 != other.l5) return false; if (l6 != other.l6) return false; if (l7 != other.l7) return false; if (l8 != other.l8) return false; if (l9 != other.l9) return false; if (l10 != other.l10) return false; if (l11 != other.l11) return false; if (l12 != other.l12) return false; if (l13 != other.l13) return false; if (l14 != other.l14) return false; if (l15 != other.l15) return false; return true; } else { // <2do> we could compare to a normal java.util.BitSet here return false; } } public void hash(HashData hd){ hd.add(hashCode()); } /** * answer the same hashCodes as java.util.BitSet */ public int hashCode() { long hc = 1234; hc ^= l0; hc ^= l1*2; hc ^= l2*3; hc ^= l4*4; hc ^= l5*5; hc ^= l6*6; hc ^= l7*7; hc ^= l8*8; hc ^= l9*9; hc ^= l10*10; hc ^= l11*11; hc ^= l12*12; hc ^= l13*13; hc ^= l14*14; hc ^= l15*15; return (int) ((hc >>32) ^ hc); } public String toString() { StringBuilder sb = new StringBuilder(); sb.append('{'); boolean first = true; for (int i=nextSetBit(0); i>= 0; i = nextSetBit(i+1)){ if (!first){ sb.append(','); } else { first = false; } sb.append(i); } sb.append('}'); return sb.toString(); } }