转化思路:转化二进制可以用余2除2的方法求出该数的二进制数。当余1时便加1。
#include<stdio.h>
int count_bit_one(int n)
{
int count = 0;
while (n)
{
if (n % 2 == 1)
{
count++;
}
n /= 2;
}
return count;
}
int main()
{
int a;
scanf("%d", &a);
int c = count_bit_one(a);
printf("count = %d", c);
return 0;
}
如果是-1,运行结果会让a=0,跳出while循环
面对这些问题,我们有两种方法来解决这些问题。
1.利用unsigned将形参无符号化。
#include<stdio.h>
int count_bit_one( unsigned int n)
{
int count = 0;
while (n)
{
if (n % 2 == 1)
{
count++;
}
n /= 2;
}
return count;
}
int main()
{
int a;
scanf("%d", &a);
int c = count_bit_one(a);
printf("count = %d", c);
return 0;
}
2.利用不断右移,与1不断按位与。进而不断判断有多少个1。
11111111111111111111111111111111//不断右移
0000000000000000000000000001
#include<stdio.h>
int count_bit_one(int n)
{
int count = 0;
for (int i = 0; i < 32; i++)
{
if (((n >> i) & 1) == 1)
count++;
}
return count;
}
int main()
{
int a;
scanf("%d", &a);
int c = count_bit_one(a);
printf("count = %d", c);
return 0;
}
3.可以利用不断按位与,来判断是否是为0。
int count_bit_one(int n)
{
int count = 0;
while (n)
{
n= n & (n - 1);//不断按位与
count++;
}
return count;
}
不足地方,望大佬指正。