This is an automated email from the ASF dual-hosted git repository.

alsay pushed a commit to branch fix_bit_packing
in repository https://gitbox.apache.org/repos/asf/datasketches-java.git

commit 2d2b69d170ca4b09b1d74b407cecfabda5f2a198
Author: AlexanderSaydakov <[email protected]>
AuthorDate: Thu Jan 9 11:20:15 2025 -0800

    fixed bit packing
---
 .../org/apache/datasketches/theta/BitPacking.java  |  4 +-
 .../apache/datasketches/theta/BitPackingTest.java  | 92 +++++++++++-----------
 2 files changed, 49 insertions(+), 47 deletions(-)

diff --git a/src/main/java/org/apache/datasketches/theta/BitPacking.java 
b/src/main/java/org/apache/datasketches/theta/BitPacking.java
index ca70dafa..de914f90 100644
--- a/src/main/java/org/apache/datasketches/theta/BitPacking.java
+++ b/src/main/java/org/apache/datasketches/theta/BitPacking.java
@@ -482,7 +482,7 @@ public class BitPacking {
 
     buf[off++] = (byte) (values[i + 3] >>> 4);
 
-    buf[off] = (byte) (values[i + 3] >>> 4);
+    buf[off] = (byte) (values[i + 3] << 4);
     buf[off++] |= values[i + 4] >>> 9;
 
     buf[off++] = (byte) (values[i + 4] >>> 1);
@@ -4449,7 +4449,7 @@ public class BitPacking {
     values[i + 1] |= Byte.toUnsignedLong(buf[off++]) << 6;
     values[i + 1] |= Byte.toUnsignedLong(buf[off]) >>> 2;
 
-    values[i + 2] = (Byte.toUnsignedLong(buf[off++]) & 2) << 33;
+    values[i + 2] = (Byte.toUnsignedLong(buf[off++]) & 3) << 33;
     values[i + 2] |= (Byte.toUnsignedLong(buf[off++])) << 25;
     values[i + 2] |= Byte.toUnsignedLong(buf[off++]) << 17;
     values[i + 2] |= Byte.toUnsignedLong(buf[off++]) << 9;
diff --git a/src/test/java/org/apache/datasketches/theta/BitPackingTest.java 
b/src/test/java/org/apache/datasketches/theta/BitPackingTest.java
index 152bee03..3ed6062e 100644
--- a/src/test/java/org/apache/datasketches/theta/BitPackingTest.java
+++ b/src/test/java/org/apache/datasketches/theta/BitPackingTest.java
@@ -31,60 +31,62 @@ public class BitPackingTest {
 
   @Test
   public void packUnpackBits() {
-    for (int bits = 1; bits <= 63; bits++) {
-      final long mask = (1 << bits) - 1;
-      long[] input = new long[8];
-      final long golden64 = Util.INVERSE_GOLDEN_U64;
-      long value = 0xaa55aa55aa55aa55L; // arbitrary starting value
-      for (int i = 0; i < 8; ++i) {
-        input[i] = value & mask;
-        value += golden64;
-      }
-      byte[] bytes = new byte[8 * Long.BYTES];
-      int bitOffset = 0;
-      int bufOffset = 0;
-      for (int i = 0; i < 8; ++i) {
-        BitPacking.packBits(input[i], bits, bytes, bufOffset, bitOffset);
-        bufOffset += (bitOffset + bits) >>> 3;
-        bitOffset = (bitOffset + bits) & 7;
-      }
+    long value = 0xaa55aa55aa55aa55L; // arbitrary starting value
+    for (int n = 0; n < 100; n++) {
+      for (int bits = 1; bits <= 63; bits++) {
+        final long mask = (1 << bits) - 1;
+        long[] input = new long[8];
+        for (int i = 0; i < 8; ++i) {
+          input[i] = value & mask;
+          value += Util.INVERSE_GOLDEN_U64;
+        }
+        byte[] bytes = new byte[8 * Long.BYTES];
+        int bitOffset = 0;
+        int bufOffset = 0;
+        for (int i = 0; i < 8; ++i) {
+          BitPacking.packBits(input[i], bits, bytes, bufOffset, bitOffset);
+          bufOffset += (bitOffset + bits) >>> 3;
+          bitOffset = (bitOffset + bits) & 7;
+        }
 
-      long[] output = new long[8];
-      bitOffset = 0;
-      bufOffset = 0;
-      for (int i = 0; i < 8; ++i) {
-        BitPacking.unpackBits(output, i, bits, bytes, bufOffset, bitOffset);
-        bufOffset += (bitOffset + bits) >>> 3;
-        bitOffset = (bitOffset + bits) & 7;
-      }
-      for (int i = 0; i < 8; ++i) {
-        assertEquals(output[i], input[i]);
+        long[] output = new long[8];
+        bitOffset = 0;
+        bufOffset = 0;
+        for (int i = 0; i < 8; ++i) {
+          BitPacking.unpackBits(output, i, bits, bytes, bufOffset, bitOffset);
+          bufOffset += (bitOffset + bits) >>> 3;
+          bitOffset = (bitOffset + bits) & 7;
+        }
+        for (int i = 0; i < 8; ++i) {
+          assertEquals(output[i], input[i]);
+        }
       }
     }
   }
 
   @Test
   public void packUnpackBlocks() {
-    for (int bits = 1; bits <= 63; bits++) {
-      if (enablePrinting) { System.out.println("bits " + bits); }
-      final long mask = (1L << bits) - 1;
-      long[] input = new long[8];
-      final long golden64 = Util.INVERSE_GOLDEN_U64;
-      long value = 0xaa55aa55aa55aa55L; // arbitrary starting value
-      for (int i = 0; i < 8; ++i) {
-        input[i] = value & mask;
-        value += golden64;
-      }
-      byte[] bytes = new byte[8 * Long.BYTES];
-      BitPacking.packBitsBlock8(input, 0, bytes, 0, bits);
-      if (enablePrinting) { hexDump(bytes); }
+    long value = 0xaa55aa55aa55aa55L; // arbitrary starting value
+    for (int n = 0; n < 100; n++) {
+      for (int bits = 1; bits <= 63; bits++) {
+        if (enablePrinting) { System.out.println("bits " + bits); }
+        final long mask = (1L << bits) - 1;
+        long[] input = new long[8];
+        for (int i = 0; i < 8; ++i) {
+          input[i] = value & mask;
+          value += Util.INVERSE_GOLDEN_U64;
+        }
+        byte[] bytes = new byte[8 * Long.BYTES];
+        BitPacking.packBitsBlock8(input, 0, bytes, 0, bits);
+        if (enablePrinting) { hexDump(bytes); }
 
-      long[] output = new long[8];
-      BitPacking.unpackBitsBlock8(output, 0, bytes, 0, bits);
+        long[] output = new long[8];
+        BitPacking.unpackBitsBlock8(output, 0, bytes, 0, bits);
 
-      for (int i = 0; i < 8; ++i) {
-        if (enablePrinting) { System.out.println("checking value " + i); }
-        assertEquals(output[i], input[i]);
+        for (int i = 0; i < 8; ++i) {
+          if (enablePrinting) { System.out.println("checking value " + i); }
+          assertEquals(output[i], input[i]);
+        }
       }
     }
   }


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to