O(logn) 的解法:
int count = 0;
while(n != 0)
{
if(n % 2 == 1)
{
count++;
}
n = n >> 1;
}
O(n) 的解法:
int main()
{
int n,i;
int f[1001];
f[0] = 0;
scanf("%d", &n);
for(i = 1; i <= n; i++)
{
f[i] = f[i & (i - 1)] + 1;
}
for(i = 1; i <= n; i++)
{
printf("%d ", f[i]);
}
printf("\n");
return 0;
}
对于位运算y = x & (x - 1),观察可以发现,y等于x去掉了二进制中最后的一位1。x = 6 = 110 , x-1 = 5 = 101 , y = 100
如果我们用一个数组 f 记录相应数字二进制表示中 1 的数量,那么 f[i] 数组存放的值是 i 这个数字二进制表示中 1 的数量,从而我们可以推导得到 f[i] = f[i & (i - 1)] + 1,也就是说 i 数字比 i & (i - 1) 数字的二进制表示中的 1 的数量要多一个,这样我们通过一步计算就得到 f[i] 的结果,也就是相应数字二进制表示中 1 的数量结果,即上述代码。