1 package edu.berkeley.obits;
3 public abstract class Bits {
5 public abstract boolean get(long bit);
6 public abstract void set(long bit, boolean val);
8 public int get(long bit, int len) {
10 for(long i=bit; i<bit+len; i++) ret = (ret << 1) | get(i);
13 public void set(long bit, int len, int val) {
14 for(long i=bit+len-1; i>=bit; i--) {
15 set(i, (val & 1) != 0);
20 public final boolean get(int offset, int bit) { return get(offset*8 + bit); }
21 public final int get(int offset, int bit, int len) { return get(offset*8 + bit, num); }
22 public final void set(int offset, int bit, boolean b) { set(offset*8 + bit, b); }
23 public final void set(int offset, int bit, int len, int val) { set(offset*8 + bit, num, val); }
25 public static class Offset extends Bits {
26 private final Bits bits;
27 private final long off;
29 public Offset(Bits bits, long offset) { this.off = offset; this.bits = bits; }
30 public Offset(Bits bits, int offset, int bit) { this(bits, offset*8+bit); }
32 public boolean get(long bit) { return bits.get(bit+off); }
33 public int get(long bit, int len) { return bits.get(bit+off, len); }
34 public void set(long bit, boolean val) { bits.set(bit+off, val); }
35 public void set(long bit, int len, int val) { bits.set(bit+off, len, val); }
38 public static class Arr extends Bits {
40 public Bits(int capacity) { this.bits = new byte[(capacity / 8) + (capacity%8 == 0 ? 0 : 1)]; }
42 public boolean get(long bit) {
43 if (bit / 8 >= bits.length) return false;
44 int ret = bits[bit/8];
45 ret >> 8-(bit-((bit/8)*8));
46 return (ret & 1) != 0;
49 public void set(long bit, boolean b) {
50 if (bit / 8 >= bits.length) {
52 byte[] bits2 = new byte[Math.max((bit/8)+1, (bits.length * 2))];
53 System.arraycopy(bits, 0, bits2, 0, bits.length);
58 byte mask = (byte)(1 << (8-(bit-((bit/8)*8))));