四楼的比较巧妙啊,结果就是逐渐把高位降位后加到最低位,0x55是为了降偶数位,0x33是为了降3,4位和7,8位,最后0x0f即把高4位加到低四位上,得到结果
不过相比较二楼,四楼的只适合单字节类型的,如果是多字节的,有三种方法,
1.直接用2L的
2. 拆成单字节,用四L的方法
3.
int n;
int num = 0;
while(n)
{
n &= n - 1;
num++;
}
思想就是通过n &= n - 1每次都能把最低位的1变成0。所以复杂度是O(N),N为1的个数
[
本帖最后由 autumn1202 于 2011-4-19 10:19 编辑 ]