https://bugs.openjdk.java.net/browse/JDK-8189230
The change included below improves the performance of {Integer,Long}.numberOfLeadingZeros primarily for negative parameters by 20% to 33% as measured by JMH benchmarks. For details please refer to the bug report. Although on certain platforms there could be an intrinsic for the methods in question, given the simplicity of the change it seems worth making. Thanks, Brian --- a/src/java.base/share/classes/java/lang/Integer.java +++ b/src/java.base/share/classes/java/lang/Integer.java @@ -1625,8 +1625,8 @@ @HotSpotIntrinsicCandidate public static int numberOfLeadingZeros(int i) { // HD, Figure 5-6 - if (i == 0) - return 32; + if (i <= 0) + return i == 0 ? 32 : 0; int n = 1; if (i >>> 16 == 0) { n += 16; i <<= 16; } if (i >>> 24 == 0) { n += 8; i <<= 8; } --- a/src/java.base/share/classes/java/lang/Long.java +++ b/src/java.base/share/classes/java/lang/Long.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1994, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1994, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -1771,8 +1771,8 @@ @HotSpotIntrinsicCandidate public static int numberOfLeadingZeros(long i) { // HD, Figure 5-6 - if (i == 0) - return 64; + if (i <= 0) + return i == 0 ? 64 : 0; int n = 1; int x = (int)(i >>> 32); if (x == 0) { n += 32; x = (int)i; }