Skip to content

Commit 6df0c11

Browse files
Merge pull request #629 from apache/fix_bit_packing
fixed bit packing
2 parents 8604dc3 + 2d2b69d commit 6df0c11

File tree

2 files changed

+49
-47
lines changed

2 files changed

+49
-47
lines changed

src/main/java/org/apache/datasketches/theta/BitPacking.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -482,7 +482,7 @@ static void packBits13(final long[] values, final int i, final byte[] buf, int o
482482

483483
buf[off++] = (byte) (values[i + 3] >>> 4);
484484

485-
buf[off] = (byte) (values[i + 3] >>> 4);
485+
buf[off] = (byte) (values[i + 3] << 4);
486486
buf[off++] |= values[i + 4] >>> 9;
487487

488488
buf[off++] = (byte) (values[i + 4] >>> 1);
@@ -4449,7 +4449,7 @@ static void unpackBits35(final long[] values, final int i, final byte[] buf, int
44494449
values[i + 1] |= Byte.toUnsignedLong(buf[off++]) << 6;
44504450
values[i + 1] |= Byte.toUnsignedLong(buf[off]) >>> 2;
44514451

4452-
values[i + 2] = (Byte.toUnsignedLong(buf[off++]) & 2) << 33;
4452+
values[i + 2] = (Byte.toUnsignedLong(buf[off++]) & 3) << 33;
44534453
values[i + 2] |= (Byte.toUnsignedLong(buf[off++])) << 25;
44544454
values[i + 2] |= Byte.toUnsignedLong(buf[off++]) << 17;
44554455
values[i + 2] |= Byte.toUnsignedLong(buf[off++]) << 9;

src/test/java/org/apache/datasketches/theta/BitPackingTest.java

Lines changed: 47 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -31,60 +31,62 @@ public class BitPackingTest {
3131

3232
@Test
3333
public void packUnpackBits() {
34-
for (int bits = 1; bits <= 63; bits++) {
35-
final long mask = (1 << bits) - 1;
36-
long[] input = new long[8];
37-
final long golden64 = Util.INVERSE_GOLDEN_U64;
38-
long value = 0xaa55aa55aa55aa55L; // arbitrary starting value
39-
for (int i = 0; i < 8; ++i) {
40-
input[i] = value & mask;
41-
value += golden64;
42-
}
43-
byte[] bytes = new byte[8 * Long.BYTES];
44-
int bitOffset = 0;
45-
int bufOffset = 0;
46-
for (int i = 0; i < 8; ++i) {
47-
BitPacking.packBits(input[i], bits, bytes, bufOffset, bitOffset);
48-
bufOffset += (bitOffset + bits) >>> 3;
49-
bitOffset = (bitOffset + bits) & 7;
50-
}
34+
long value = 0xaa55aa55aa55aa55L; // arbitrary starting value
35+
for (int n = 0; n < 100; n++) {
36+
for (int bits = 1; bits <= 63; bits++) {
37+
final long mask = (1 << bits) - 1;
38+
long[] input = new long[8];
39+
for (int i = 0; i < 8; ++i) {
40+
input[i] = value & mask;
41+
value += Util.INVERSE_GOLDEN_U64;
42+
}
43+
byte[] bytes = new byte[8 * Long.BYTES];
44+
int bitOffset = 0;
45+
int bufOffset = 0;
46+
for (int i = 0; i < 8; ++i) {
47+
BitPacking.packBits(input[i], bits, bytes, bufOffset, bitOffset);
48+
bufOffset += (bitOffset + bits) >>> 3;
49+
bitOffset = (bitOffset + bits) & 7;
50+
}
5151

52-
long[] output = new long[8];
53-
bitOffset = 0;
54-
bufOffset = 0;
55-
for (int i = 0; i < 8; ++i) {
56-
BitPacking.unpackBits(output, i, bits, bytes, bufOffset, bitOffset);
57-
bufOffset += (bitOffset + bits) >>> 3;
58-
bitOffset = (bitOffset + bits) & 7;
59-
}
60-
for (int i = 0; i < 8; ++i) {
61-
assertEquals(output[i], input[i]);
52+
long[] output = new long[8];
53+
bitOffset = 0;
54+
bufOffset = 0;
55+
for (int i = 0; i < 8; ++i) {
56+
BitPacking.unpackBits(output, i, bits, bytes, bufOffset, bitOffset);
57+
bufOffset += (bitOffset + bits) >>> 3;
58+
bitOffset = (bitOffset + bits) & 7;
59+
}
60+
for (int i = 0; i < 8; ++i) {
61+
assertEquals(output[i], input[i]);
62+
}
6263
}
6364
}
6465
}
6566

6667
@Test
6768
public void packUnpackBlocks() {
68-
for (int bits = 1; bits <= 63; bits++) {
69-
if (enablePrinting) { System.out.println("bits " + bits); }
70-
final long mask = (1L << bits) - 1;
71-
long[] input = new long[8];
72-
final long golden64 = Util.INVERSE_GOLDEN_U64;
73-
long value = 0xaa55aa55aa55aa55L; // arbitrary starting value
74-
for (int i = 0; i < 8; ++i) {
75-
input[i] = value & mask;
76-
value += golden64;
77-
}
78-
byte[] bytes = new byte[8 * Long.BYTES];
79-
BitPacking.packBitsBlock8(input, 0, bytes, 0, bits);
80-
if (enablePrinting) { hexDump(bytes); }
69+
long value = 0xaa55aa55aa55aa55L; // arbitrary starting value
70+
for (int n = 0; n < 100; n++) {
71+
for (int bits = 1; bits <= 63; bits++) {
72+
if (enablePrinting) { System.out.println("bits " + bits); }
73+
final long mask = (1L << bits) - 1;
74+
long[] input = new long[8];
75+
for (int i = 0; i < 8; ++i) {
76+
input[i] = value & mask;
77+
value += Util.INVERSE_GOLDEN_U64;
78+
}
79+
byte[] bytes = new byte[8 * Long.BYTES];
80+
BitPacking.packBitsBlock8(input, 0, bytes, 0, bits);
81+
if (enablePrinting) { hexDump(bytes); }
8182

82-
long[] output = new long[8];
83-
BitPacking.unpackBitsBlock8(output, 0, bytes, 0, bits);
83+
long[] output = new long[8];
84+
BitPacking.unpackBitsBlock8(output, 0, bytes, 0, bits);
8485

85-
for (int i = 0; i < 8; ++i) {
86-
if (enablePrinting) { System.out.println("checking value " + i); }
87-
assertEquals(output[i], input[i]);
86+
for (int i = 0; i < 8; ++i) {
87+
if (enablePrinting) { System.out.println("checking value " + i); }
88+
assertEquals(output[i], input[i]);
89+
}
8890
}
8991
}
9092
}

0 commit comments

Comments
 (0)