法一:通过移位,再与1进行按位与&
#include<stdio.h>
int main()
{
int n;
scanf("%d", &n);
int i = 0;
int count = 0;
for (i = 0; i < 32; i++)
{
if ((n >> i) & 1 == 1)
count++;
}
printf("%d", count);
}
以10为例00000000 00000000 00000000 00001010
向左移位(0,1,2.......)和1按位与&(全1才是1)所以count=2;
法二:类比十进制%10,/10的操作求出每个数,二进制%2,/2也可以求出每个数
#include<stdio.h>
int main()
{
int n;
scanf("%d", &n);
int count = 0;
while (n)
{
n=n& (n - 1);
count++;
}
printf("%d", count);
}
法三:这个比较高端,一般难想到。进行n&(n-1)每次都会把最右边的1去掉,去掉一次count++;
#include<stdio.h>
int main()
{
int n;
scanf("%d", &n);
int count = 0;
while (n)
{
if (n % 2 == 1)
count++;
n = n / 2;
}
printf("%d", count);
}