Mercurial > hg > Members > kono > jpf-core
diff src/main/gov/nasa/jpf/util/BitSet1024.java @ 0:61d41facf527
initial v8 import (history reset)
author | Peter Mehlitz <Peter.C.Mehlitz@nasa.gov> |
---|---|
date | Fri, 23 Jan 2015 10:14:01 -0800 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/gov/nasa/jpf/util/BitSet1024.java Fri Jan 23 10:14:01 2015 -0800 @@ -0,0 +1,896 @@ +/* + * Copyright (C) 2014, United States Government, as represented by the + * Administrator of the National Aeronautics and Space Administration. + * All rights reserved. + * + * The Java Pathfinder core (jpf-core) platform is licensed under the + * Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0. + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package gov.nasa.jpf.util; + + +/** + * 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 extends AbstractFixedBitSet { + + public static final int INDEX_MASK = 0xfffffc00; + + long l0, l1, l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12, l13, l14, l15; + + public BitSet1024 (){ + // nothing in here + } + + public BitSet1024 (int i){ + set(i); + } + + public BitSet1024 (int... idx){ + for (int i : idx){ + set(i); + } + } + + 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) + + @Override + 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); + } + } + + @Override + 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); + } + } + + @Override + 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); + } + + @Override + public int size() { + return 1024; + } + + /** + * number of bits we can store + */ + @Override + public int capacity() { + return 1024; + } + + /** + * index of highest set bit + 1 + */ + @Override + 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; + } + } + + @Override + public void clear() { + l0 = l1 = l2 = l3 = l4 = l5 = l6 = l7 + = l8 = l9= l10 = l11 = l12 = l13 = l14 + = l15 =0L; + cardinality = 0; + } + + + @Override + 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; + } + + @Override + 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(); + } + + @Override + 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; + } + } + + /** + * answer the same hashCodes as java.util.BitSet + */ + @Override + 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); + } + + + @Override + public void hash (HashData hd){ + hd.add(l0); + hd.add(l1); + hd.add(l2); + hd.add(l3); + hd.add(l4); + hd.add(l5); + hd.add(l6); + hd.add(l7); + hd.add(l8); + hd.add(l9); + hd.add(l10); + hd.add(l11); + hd.add(l12); + hd.add(l13); + hd.add(l14); + hd.add(l15); + } +}