返回
剖析 JDK 源码:揭秘 Integer.bitCount() 的奥秘
见解分享
2023-12-13 02:57:16
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 源码,我们不仅了解了其内部运作机制,更领略了算法设计中的智慧和精妙。