统计二进制数字中1的个数
三种方法
1.逐位比较 O(n) = 32
int Count1(int n)
{
int count = 0;
while (n != 0)
{
count += n&1;
n >>= 1;
}
return count;
}
2.最低1位清零 O(n) = count(n) //适用于1很稀疏的情况
int Count2(int n)
{
int count = n;
while (n != 0)
{
n &= n - 1;
++count;
}
return count;
}
3.直接位运算 O(n) = 5
int Count3(int n)
{
n = (n&0x55555555) + ((n>>1)&0x55555555);
n = (n&0x33333333) + ((n>>2)&0x33333333);
n = (n&0x0f0f0f0f) + ((n>>4)&0x0f0f0f0f);
n = (n&0x00ff00ff) + ((n>>8)&0x00ff00ff);
n = (n&0x0000ffff) + ((n>>16)&0x0000ffff);
return n;
}
统计二进制数字中1的个数,这个问题有个专业的名字:Hamming_weight problem
int Hamming_weight(int n, int type)
{
switch (type)
{
case 1:
return Count1(n);
break;
case 2:
return Count2(n);
break;
case 3:
return Count3(n);
break;
default:
return -1;
break;
}
}