From a70a2503328601223537ce071d2f13be1bab6de4 Mon Sep 17 00:00:00 2001 From: Sagar Upadhyaya Date: Fri, 3 Oct 2025 13:14:43 -0700 Subject: [PATCH] Replace conditional logic in add(), subtract() with bit manipulation --- .../org/apache/lucene/util/NumericUtils.java | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/lucene/core/src/java/org/apache/lucene/util/NumericUtils.java b/lucene/core/src/java/org/apache/lucene/util/NumericUtils.java index 1249b8324e0a..f9e97e4b9d17 100644 --- a/lucene/core/src/java/org/apache/lucene/util/NumericUtils.java +++ b/lucene/core/src/java/org/apache/lucene/util/NumericUtils.java @@ -96,13 +96,10 @@ public static void subtract(int bytesPerDim, int dim, byte[] a, byte[] b, byte[] int end = start + bytesPerDim; int borrow = 0; for (int i = end - 1; i >= start; i--) { + // diff is always in the range [-256, 255] int diff = (a[i] & 0xff) - (b[i] & 0xff) - borrow; - if (diff < 0) { - diff += 256; - borrow = 1; - } else { - borrow = 0; - } + borrow = (diff >>> 31); // Extract sign bit as borrow + diff += (borrow << 8); result[i - start] = (byte) diff; } if (borrow != 0) { @@ -120,12 +117,9 @@ public static void add(int bytesPerDim, int dim, byte[] a, byte[] b, byte[] resu int carry = 0; for (int i = end - 1; i >= start; i--) { int digitSum = (a[i] & 0xff) + (b[i] & 0xff) + carry; - if (digitSum > 255) { - digitSum -= 256; - carry = 1; - } else { - carry = 0; - } + // Below is safe as digitSum can be at most 511(255 * 2 + 1), so never exceeds 9 bits + carry = digitSum >>> 8; + digitSum &= 0xFF; result[i - start] = (byte) digitSum; } if (carry != 0) {