返回

剖析 JDK 源码:揭秘 Integer.bitCount() 的奥秘

见解分享

Java 语言中,Integer.bitCount() 方法可谓统计整数值中二进制 1 位数量的利器。为了深入理解其内部运作机制,本文将深入探究 JDK 源码,逐一解析三种不同的实现方式,为您呈现该方法的精妙之处。

方法一:逐位与运算

思路:将二进制的每一位依次与 1 作与运算,统计 "1" 的数量。算法复杂度为 O(n),其中 n 为二进制位数。

public static int bitCount(int i) {
    int count = 0;
    while (i != 0) {
        if ((i & 1) != 0) {
            count++;
        }
        i >>>= 1;
    }
    return count;
}

方法二:减一与运算

思路:将整数减一后与原数作与运算,达到将原二进制最低位 "1" 重置为 "0" 的目的。此时算法复杂度为 O(n),但 n 为二进制中 "1" 的个数。

public static int bitCount(int i) {
    int count = 0;
    while (i != 0) {
        i = i & (i - 1);
        count++;
    }
    return count;
}

方法三:位组统计

思路:先每两位一组统计二进制中的 "1",然后每四位一组统计 "1",接着是 8 位、... 依次类推,将统计结果相加即可。

public static int bitCount(int i) {
    i = i - ((i >>> 1) & 0x55555555);
    i = (i & 0x33333333) + ((i >>> 2) & 0x33333333);
    i = (i + (i >>> 4)) & 0x0f0f0f0f;
    i = i + (i >>> 8);
    i = i + (i >>> 16);
    return i & 0x7f;
}

性能对比

三种方法的性能差异取决于输入整数中 "1" 的数量。当 "1" 的数量较多时,方法三具有优势,因为其算法复杂度为 O(log2(n))。而当 "1" 的数量较少时,方法一和方法二的性能更为出色。

总结

Integer.bitCount() 方法通过上述三种算法巧妙地统计了整数值中二进制 1 位的数量。通过深入剖析 JDK 源码,我们不仅了解了其内部运作机制,更领略了算法设计中的智慧和精妙。