#include<stdio.h>
int main()
{
int n,cnt=0;
scanf("%d",&n);
while(n){
if(n&1==1){
cnt++;
}
n=n>>1;
}
printf("%d",cnt);
return 0;
}
对于一个二进制数,想要快速统计它 1 的个数,正解大概不会是遍历一遍。
我们考虑用位运算。如果能快速在统计一个 1 之后就删掉它,并不断循环的话就是一个解决思路。正好,在位运算中的 & 可以实现选择性删除。(1&1=1,1&0=0)
我们可以发现,x&=(x-1) 可以实现删除最后一位 1。
#include<stdio.h>
int lowbit(int x){
return x&-x;
}
int main()
{
int n,cnt=0;
scanf("%d",&n);
while(n){
n-=lowbit(n);
cnt++;
}
printf("%d",cnt);
return 0;
}