package edu.berkeley.cs.succinct.util.stream.serops; import edu.berkeley.cs.succinct.util.stream.RandomAccessLongStream; import java.io.IOException; public class BitMapOps { /** * Get bit at specified position in serialized bitmap. * * @param bitmap Serialized bitmap. * @param i Index into serialized bitmap. * @return Value of bit. */ public static long getBit(RandomAccessLongStream bitmap, int i) throws IOException { return ((bitmap.get((int) (bitmap.position() + (i / 64))) >>> (63L - i)) & 1L); } /** * Get value at specified index of serialized bitmap. * * @param bitmap Serialized bitmap. * @param pos Position into bitmap. * @param bits Width in bits of value. * @return Value at specified position. */ public static long getValPos(RandomAccessLongStream bitmap, int pos, int bits) throws IOException { assert (pos >= 0); int basePos = (int) bitmap.position(); long val; long s = (long) pos; long e = s + (bits - 1); if ((s / 64) == (e / 64)) { val = bitmap.get(basePos + (int) (s / 64L)) << (s % 64); val = val >>> (63 - e % 64 + s % 64); } else { val = bitmap.get(basePos + (int) (s / 64L)) << (s % 64); val = val >>> (s % 64 - (e % 64 + 1)); val = val | (bitmap.get(basePos + (int) (e / 64L)) >>> (63 - e % 64)); } assert (val >= 0); return val; } }