Integer numberOfTrailingZeros的实现

时间:2014-10-06 04:19:14

标签: java performance jvm bit

我在java中找到了Integer numberOfTrailingZeros方法的实现,如下所示

public static int numberOfTrailingZeros(int i) {
    // HD, Figure 5-14
    int y;
    if (i == 0) return 32;
    int n = 31;
    y = i <<16; if (y != 0) { n = n -16; i = y; }
    y = i << 8; if (y != 0) { n = n - 8; i = y; }
    y = i << 4; if (y != 0) { n = n - 4; i = y; }
    y = i << 2; if (y != 0) { n = n - 2; i = y; }
    return n - ((i << 1) >>> 31);
}

我需要一段时间才能理解,这是我的解决方案:

public static int numberOfTrailingZeros(int i) {
    if (i == 0) return 32;
    int num = 0;
    while ((i & 1) == 0) {
        i >>= 1;
        num ++;
    }
    return num;
}

我的问题是什么是更好的解决方案?我怎样才能提出这些工具,如JDK Integer bitCount,highestOneBit,rotateLeft等方法? 我知道JDK的numberOfTrailingZeros使用less + opeartor,并且在处理'0x70000000','0x60000000'等等时会有更高的性能吗?

1 个答案:

答案 0 :(得分:2)

java JDK正在做的是在数字中进行二元搜索,以查找尾随零的数量。它试图将剩余的数字移动2,以查看移位的数字是否变为0.如果没有,则有一些设置位远离右侧,因此该方法保持该移位数,减少最终数量计数,然后再次尝试下一个最小的2次幂。