import java.lang.reflect.*;

public class BitSet implements Set<Integer> {
  public final int INT_BITS = 32;
  
  private int vector[];

  protected int capacity;

  public BitSet(int capacity) {
    vector = new int[1 + capacity / INT_BITS];
    this.capacity = capacity;
  }

  public void add(Integer e) {
    int index = e / INT_BITS;
    int offset = e % INT_BITS;
    int bit = 1 << offset;
    vector[index] |= bit;
  }

  public void del(Integer e) {
    int index = e / INT_BITS;
    int offset = e % INT_BITS;
    int bit = 1 << offset;
    vector[index] &= ~bit;
  }

  public boolean contains(Integer e) {
    int index = e / INT_BITS;
    int offset = e % INT_BITS;
    int bit = 1 << offset;
    return (vector[index] & bit) > 0;
  }

  public static void main(String args[]) {
    Set<Integer> s = new BitSet(15);
    s.add(14);
    System.out.println("Contains 14? " + s.contains(14));
    s.add(15);
    System.out.println("Contains 15? " + s.contains(15));
    s.add(16);
    System.out.println("Contains 16? " + s.contains(16));
    s.add(31);
    System.out.println("Contains 31? " + s.contains(31));
    try {
        Field f = s.getClass().getDeclaredField("capacity");
          f.setAccessible(true);
            int cap = (int)f.getInt(s);
              System.out.println("Value of field = " + cap);
    } catch (Exception e) {
        e.printStackTrace();
    }
  }

}
