int entry = ((numbits + start) / 64) % bits.length;
int off = (numbits + start) % 64;
int maxadd = 64 - off;
- bits[entry] = (bits[entry] & (-1L >>> maxadd)) | (data << off);
+ long mask = maxadd < 64 ? (-1L >>> maxadd) : 0L;
+ bits[entry] = (bits[entry] & mask) | (data << off);
if (num > maxadd) {
numbits += maxadd;
return add(data >>> maxadd, num - maxadd);
int off = start % 64;
int max = 64 - off;
int n = num > max ? max : num;
- long res = (bits[entry] >>> off) & (-1L >>> (64 - n));
+ long mask = n > 0 ? (-1L >>> (64 - n)) : 0L;
+ long res = (bits[entry] >>> off) & mask;
int oldstart = start;
if (n < num) {
int n2 = num - n;
- res |= (bits[(entry + 1) % bits.length] & (-1L >>> (64 - n2))) << n;
+ long mask2 = n2 > 0 ? (-1L >>> (64 - n2)) : 0L;
+ res |= (bits[(entry + 1) % bits.length] & mask2) << n;
}
start = (start + num) % (64 * bits.length);
numbits -= num;
return 64 * bits.length;
}
// Test code for BitStorage
+ static void test3(String[] args) {
+ BitStorage bs = new BitStorage(37);
+ Random rand = new Random();
+ Vector ins = new Vector();
+ Vector ret = new Vector();
+ StringBuffer sbi = new StringBuffer();
+ StringBuffer sbr = new StringBuffer();
+ System.out.println("==== Test #3 ====");
+ System.out.println("inserting...");
+ long data = rand.nextLong();
+ bs.add(data, 0);
+ ins.add(new Integer(0));
+ data = rand.nextLong();
+ int num = rand.nextInt(37);
+ int s = bs.size();
+ bs.add(data, num);
+ assert bs.size() - s == num : "bad size: " + s + " + " + num + " != " + bs.size();
+ ins.add(new Integer(num));
+ add(sbi, data, num);
+ print(data, num);
+ System.out.println("\nretrieving...");
+ num = bs.size();
+ data = bs.get(num);
+ ret.add(new Integer(num));
+ add(sbr, data, num);
+ print(data, num);
+ System.out.println("\ninsertion sequence:");
+ for (int i = 0; i < ins.size(); i++) {
+ System.out.print(" " + ins.get(i));
+ }
+ System.out.println("\nretrieval sequence:");
+ for (int i = 0; i < ret.size(); i++) {
+ System.out.print(" " + ret.get(i));
+ }
+ System.out.println();
+ check(sbi, sbr);
+ }
static void test2(String[] args) {
int iters = (args.length > 0 ? Integer.parseInt(args[0]) : 10);
BitStorage bs = new BitStorage(37 * iters);
public static void main(String[] args) {
BitStorage.test1(args);
BitStorage.test2(args);
+ BitStorage.test3(args);
}
// Ship implementation