package org.limewire.collection; /** * Provides a <code>BitField</code> implementation for a {@link BitSet} object. * <pre> void sampleCodeBitFieldSet(){ BitSet bs1 = new BitSet(); bs1.set(1); bs1.set(3); BitSet bs2 = new BitSet(); bs2.set(2); BitSet bs3 = new BitSet(); bs3.set(3); BitField bf1 = new BitFieldSet(bs1, 16); BitField bf2 = new BitFieldSet(bs2, 16); BitField bf3 = new BitFieldSet(bs3, 16); PrintBFInfo(bf1, "bf1"); PrintBFInfo(bf2, "bf2"); PrintBFInfo(bf3, "bf3"); } void PrintBFInfo(BitField bf, String bfn){ System.out.println(bfn); for(int i = 0; i < bf.maxSize(); i++){ int j = 0; if(bf.get(i)) j = 1; System.out.print(j); } System.out.println(); System.out.println("cardinality: " + bf.cardinality()); System.out.println("Next clear bit is: " + bf.nextClearBit(2)); System.out.println("Next set bit is: " + bf.nextSetBit(0)); System.out.println(); } Output: bf1 0101000000000000 cardinality: 2 Next clear bit is: 2 Next set bit is: 1 bf2 0010000000000000 cardinality: 1 Next clear bit is: 3 Next set bit is: 2 bf3 0001000000000000 cardinality: 1 Next clear bit is: 2 Next set bit is: 3 </pre> * */ public class BitFieldSet implements BitField { private final int maxSize; private final BitSet bs; /** * Constructs a BitField view over the passed bitset with the * specified size. */ public BitFieldSet(BitSet bs, int maxSize) { this.bs = bs; this.maxSize = maxSize; } public int maxSize() { return maxSize; } public int cardinality() { if (bs.length() <= maxSize) return bs.cardinality(); else return bs.get(0, maxSize).cardinality(); // expensive, avoid. } public boolean get(int i) { if (i > maxSize) throw new IndexOutOfBoundsException(); return bs.get(i); } public int nextClearBit(int i) { int ret = bs.nextClearBit(i); return ret >= maxSize ? -1 : ret; } public int nextSetBit(int i) { int ret = bs.nextSetBit(i); return ret >= maxSize ? -1 : ret; } }