java方法:java.lang.Integer.numberOfLeadingZeros(int)可以进行优化

Jas*_*son -3 java openjdk jvm jvm-hotspot

原始代码是:

public static int numberOfLeadingZeros(int i) {
    // HD, Figure 5-6
    if (i == 0)
        return 32;
    int n = 1;
    if (i >>> 16 == 0) { n += 16; i <<= 16; }
    if (i >>> 24 == 0) { n +=  8; i <<=  8; }
    if (i >>> 28 == 0) { n +=  4; i <<=  4; }
    if (i >>> 30 == 0) { n +=  2; i <<=  2; }
    n -= i >>> 31;
    return n;
}
Run Code Online (Sandbox Code Playgroud)

我认为它可以优化,应该添加以下条件:

if (i < 0)
        return 0;
Run Code Online (Sandbox Code Playgroud)

完全优化的代码是:

public static int numberOfLeadingZeros(int i) {
    if(i<=0) {
        return i < 0 ? 0 : 32;
    }
    int n = 1;
    if (i >>> 16 == 0) { n += 16; i <<= 16; }
    if (i >>> 24 == 0) { n +=  8; i <<=  8; }
    if (i >>> 28 == 0) { n +=  4; i <<=  4; }
    if (i >>> 30 == 0) { n +=  2; i <<=  2; }
    n -= i >>> 31;
    return n;
}
Run Code Online (Sandbox Code Playgroud)

ass*_*ias 5

理论上是的,你的建议是有道理的.

实际上,除非你使用一个奇特的JVM,否则它不会有任何区别,因为该方法是内在的,因此执行的代码不是你可以在Java类中找到的代码.

例如,在x86/64 cpus上,代码在这里并使用bsrlCPU指令,这是你希望的最快速度.