(1)这种方法虽然简单,但是存在明显缺陷,当输入的数为负数时,显然结果不正确。
#include <stdio.h>
int main()
{
int num = 0;
int count = 0;
printf("输入一个数:");
scanf_s("%d", &num);
while (num != 0)
{
if (num % 2 == 1)
{
count++;
}
num = num / 2;
}
printf("count=%d\n", count);
return 0;
}
2.按位与&操作符,两数二进制序列同位同一出一,其余出零.拿这个数与一按位与,这样就可以判断哪一位为一,哪一位为零.
#include<stdio.h>
int main()
{
int num;
int count = 0, i = 32;
printf("请输入一个数字:");
scanf_s("%d", &num);
while (i--)
{
if ((num & 1) == 1)//按位与&,同为1时出1
{
count++;
}
num = num >> 1;//右移1位,相当于num/2
}
printf("输出数字在二进制中 1 的个数:");
printf("%d\n", count);
return 0;
}
3.举个例子,输入9,它的二进制为1001(实际应该在内存中以32位存在),8的二进制为1000,那么它们的二进制序列按位与的结果为1000,而7的二进制序列为0111,二者按位与的结果为0000,循环终止,count自加两次,所以输出count的值为2,正确.
#include <stdio.h>
int main()
{
int num = 0;
int count = 0;
printf("输入一个数:");
scanf_s("%d", &num);
while (num != 0)
{
count++;
//将它与它相邻的数按位与
num = num&(num - 1);
}
printf("count=%d\n", count);
return 0;
}