1. Integer.bitCount
public static int bitCount(int i) {
// HD, Figure 5-2
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 & 0x3f;
}
分析:开始死活都没看懂是什么原理,后来网上搜了一顿,大都是从同一篇文章转过去的,说的也不是很清楚,后来翻了Hacker’s Delight,才算是弄明白了。过程推导如下:
为了快速的求整数中二进制表示中1的位数,采用了二分法,思想如下:首先设置每个2位字段为原来的两个单个位的和(即开始每两个bit位为一组,组内求和),将结果放入相应的中间数中,如何对中间数重新分组,每4位一组,组内求和,以此类推。
实例如下:
这个思想和归并排序类似,要统计32个bit位的和,先分成两组,每组16bit,分别求和,然后将和加起来。而对于16bit数据的求和,转化合成8bit的求和,以次类推。
算法的复杂度为:O(logN) (因为归并结果的复杂度为O(1),复杂度由主定理得出)
上面的思想用代码表示就是:
i= (i&0x55555555) + ((i>>>1)&0x55555555 );
i= (i&0x33333333) + ((i>>>2)&