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

jhyde pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/calcite.git


The following commit(s) were added to refs/heads/master by this push:
     new 8555e1b  [CALCITE-3714] BitString.createFromBytes reverses order of 
the bits in each byte
8555e1b is described below

commit 8555e1bc14f0e94a2f1c1e25d56c1a04341e432e
Author: Julian Hyde <[email protected]>
AuthorDate: Mon Jan 6 19:10:46 2020 -0800

    [CALCITE-3714] BitString.createFromBytes reverses order of the bits in each 
byte
    
    Also, implement hashCode and equals in BitString.
---
 .../java/org/apache/calcite/util/BitString.java    | 22 ++++++++++++++++-----
 .../java/org/apache/calcite/util/UtilTest.java     | 23 +++++++++++++++++-----
 2 files changed, 35 insertions(+), 10 deletions(-)

diff --git a/core/src/main/java/org/apache/calcite/util/BitString.java 
b/core/src/main/java/org/apache/calcite/util/BitString.java
index d715097..f523826 100644
--- a/core/src/main/java/org/apache/calcite/util/BitString.java
+++ b/core/src/main/java/org/apache/calcite/util/BitString.java
@@ -18,6 +18,7 @@ package org.apache.calcite.util;
 
 import java.math.BigInteger;
 import java.util.List;
+import java.util.Objects;
 
 /**
  * String of bits.
@@ -90,6 +91,17 @@ public class BitString {
     return toBitString();
   }
 
+  @Override public int hashCode() {
+    return bits.hashCode() + bitCount;
+  }
+
+  @Override public boolean equals(Object o) {
+    return o == this
+        || o instanceof BitString
+        && bits.equals(((BitString) o).bits)
+        && bitCount == ((BitString) o).bitCount;
+  }
+
   public int getBitCount() {
     return bitCount;
   }
@@ -192,14 +204,14 @@ public class BitString {
    * @return BitString
    */
   public static BitString createFromBytes(byte[] bytes) {
-    assert bytes != null;
-    int bitCount = bytes.length * 8;
+    int bitCount = Objects.requireNonNull(bytes).length * 8;
     StringBuilder sb = new StringBuilder(bitCount);
     for (byte b : bytes) {
-      for (int i = 7; i >= 0; --i) {
-        sb.append(((b & 1) == 0) ? '0' : '1');
-        b >>= 1;
+      final String s = Integer.toBinaryString(Byte.toUnsignedInt(b));
+      for (int i = s.length(); i < 8; i++) {
+        sb.append('0'); // pad to length 8
       }
+      sb.append(s);
     }
     return new BitString(sb.toString(), bitCount);
   }
diff --git a/core/src/test/java/org/apache/calcite/util/UtilTest.java 
b/core/src/test/java/org/apache/calcite/util/UtilTest.java
index 3fc4ac3..b853f67 100644
--- a/core/src/test/java/org/apache/calcite/util/UtilTest.java
+++ b/core/src/test/java/org/apache/calcite/util/UtilTest.java
@@ -90,7 +90,6 @@ import java.util.function.Function;
 import java.util.function.ObjIntConsumer;
 
 import static org.apache.calcite.test.Matchers.isLinux;
-import static org.apache.calcite.util.BitString.createFromBitString;
 
 import static org.hamcrest.CoreMatchers.equalTo;
 import static org.hamcrest.CoreMatchers.instanceOf;
@@ -334,13 +333,27 @@ public class UtilTest {
     assertReversible("01");
     assertReversible("001010");
     assertReversible("000000000100");
+
+    // from bytes
+    final byte[] b255 = {(byte) 0xFF};
+    assertThat(BitString.createFromBytes(b255).toString(),
+        is("11111111"));
+    final byte[] b11 = {(byte) 0x0B};
+    assertThat(BitString.createFromBytes(b11).toString(),
+        is("00001011"));
+    final byte[] b011 = {(byte) 0x00, 0x0B};
+    assertThat(BitString.createFromBytes(b011).toString(),
+        is("0000000000001011"));
   }
 
   private static void assertReversible(String s) {
-    assertEquals(createFromBitString(s).toBitString(), s, s);
-    assertEquals(
-        s,
-        BitString.createFromHexString(s).toHexString());
+    final BitString bitString = BitString.createFromBitString(s);
+    assertThat(bitString.toBitString(), is(s));
+    assertThat(BitString.createFromHexString(s).toHexString(), is(s));
+
+    final BitString bitString8 =
+        BitString.createFromBytes(bitString.getAsByteArray());
+    assertThat(bitString8.getAsByteArray(), is(bitString.getAsByteArray()));
   }
 
   private void assertByteArray(

Reply via email to