This is an automated email from the ASF dual-hosted git repository. sebb pushed a commit to branch java8-simplify in repository https://gitbox.apache.org/repos/asf/commons-numbers.git
commit 2f60d424725ca619abf324858593368e66dd5fc2 Author: Sebb <s...@apache.org> AuthorDate: Sun Dec 24 13:20:13 2023 +0000 Use Java 1.8 methods to simplify the ArithmeticUtils methods remainderUnsigned and divideUnsigned (both int and long) --- .../commons/numbers/core/ArithmeticUtils.java | 68 +++------------------- src/changes/changes.xml | 3 + 2 files changed, 11 insertions(+), 60 deletions(-) diff --git a/commons-numbers-core/src/main/java/org/apache/commons/numbers/core/ArithmeticUtils.java b/commons-numbers-core/src/main/java/org/apache/commons/numbers/core/ArithmeticUtils.java index d34d7e2b..7afde103 100644 --- a/commons-numbers-core/src/main/java/org/apache/commons/numbers/core/ArithmeticUtils.java +++ b/commons-numbers-core/src/main/java/org/apache/commons/numbers/core/ArithmeticUtils.java @@ -470,7 +470,7 @@ public final class ArithmeticUtils { * Returns the unsigned remainder from dividing the first argument * by the second where each argument and the result is interpreted * as an unsigned value. - * <p>This method does not use the {@code long} datatype.</p> + * <p>This method uses the Java 1.8+ method {@link Integer#remainderUnsigned(int, int)}.</p> * * @param dividend the value to be divided * @param divisor the value doing the dividing @@ -478,27 +478,14 @@ public final class ArithmeticUtils { * the second argument. */ public static int remainderUnsigned(int dividend, int divisor) { - if (divisor >= 0) { - if (dividend >= 0) { - return dividend % divisor; - } - // The implementation is a Java port of algorithm described in the book - // "Hacker's Delight" (section "Unsigned short division from signed division"). - final int q = ((dividend >>> 1) / divisor) << 1; - dividend -= q * divisor; - if (dividend < 0 || dividend >= divisor) { - dividend -= divisor; - } - return dividend; - } - return dividend >= 0 || dividend < divisor ? dividend : dividend - divisor; + return Integer.remainderUnsigned(dividend, divisor); } /** * Returns the unsigned remainder from dividing the first argument * by the second where each argument and the result is interpreted * as an unsigned value. - * <p>This method does not use the {@code BigInteger} datatype.</p> + * <p>This method uses the Java 1.8+ method {@link Long#remainderUnsigned(int, int)}.</p> * * @param dividend the value to be divided * @param divisor the value doing the dividing @@ -506,20 +493,7 @@ public final class ArithmeticUtils { * the second argument. */ public static long remainderUnsigned(long dividend, long divisor) { - if (divisor >= 0L) { - if (dividend >= 0L) { - return dividend % divisor; - } - // The implementation is a Java port of algorithm described in the book - // "Hacker's Delight" (section "Unsigned short division from signed division"). - final long q = ((dividend >>> 1) / divisor) << 1; - dividend -= q * divisor; - if (dividend < 0L || dividend >= divisor) { - dividend -= divisor; - } - return dividend; - } - return dividend >= 0L || dividend < divisor ? dividend : dividend - divisor; + return Long.remainderUnsigned(dividend, divisor); } /** @@ -531,7 +505,7 @@ public final class ArithmeticUtils { * bit-wise identical if the two operands are regarded as both * being signed or both being unsigned. Therefore separate {@code * addUnsigned}, etc. methods are not provided.</p> - * <p>This method does not use the {@code long} datatype.</p> + * <p>This method uses the Java 1.8+ method {@link Integer#divideUnsigned(int, int)}.</p> * * @param dividend the value to be divided * @param divisor the value doing the dividing @@ -539,20 +513,7 @@ public final class ArithmeticUtils { * the second argument */ public static int divideUnsigned(int dividend, int divisor) { - if (divisor >= 0) { - if (dividend >= 0) { - return dividend / divisor; - } - // The implementation is a Java port of algorithm described in the book - // "Hacker's Delight" (section "Unsigned short division from signed division"). - int q = ((dividend >>> 1) / divisor) << 1; - dividend -= q * divisor; - if (dividend < 0L || dividend >= divisor) { - q++; - } - return q; - } - return dividend >= 0 || dividend < divisor ? 0 : 1; + return Integer.divideUnsigned(dividend, divisor); } /** @@ -564,7 +525,7 @@ public final class ArithmeticUtils { * bit-wise identical if the two operands are regarded as both * being signed or both being unsigned. Therefore separate {@code * addUnsigned}, etc. methods are not provided.</p> - * <p>This method does not use the {@code BigInteger} datatype.</p> + * <p>This method uses the Java 1.8+ method {@link Long#divideUnsigned(int, int)}.</p> * * @param dividend the value to be divided * @param divisor the value doing the dividing @@ -572,20 +533,7 @@ public final class ArithmeticUtils { * the second argument. */ public static long divideUnsigned(long dividend, long divisor) { - if (divisor >= 0L) { - if (dividend >= 0L) { - return dividend / divisor; - } - // The implementation is a Java port of algorithm described in the book - // "Hacker's Delight" (section "Unsigned short division from signed division"). - long q = ((dividend >>> 1) / divisor) << 1; - dividend -= q * divisor; - if (dividend < 0L || dividend >= divisor) { - q++; - } - return q; - } - return dividend >= 0L || dividend < divisor ? 0L : 1L; + return Long.divideUnsigned(dividend, divisor); } /** diff --git a/src/changes/changes.xml b/src/changes/changes.xml index d9b796b2..c9e96a1f 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -56,6 +56,9 @@ If the output is not quite correct, check for invisible trailing spaces! <release version="1.2" date="TBD" description=" New features, updates and bug fixes. "> + <action dev="sebb" type="update"> + Use Java 1.8 methods to simplify the ArithmeticUtils methods remainderUnsigned and divideUnsigned (both int and long) + </action> <action dev="aherbert" type="add" due-to="Harald Kirsch" issue="NUMBERS-205"> "Addition/Multiplication": Introduces isZero to Addition and isOne to Multiplication interfaces. Override the default implementation in implementing classes to avoid