方法一://内存二进制即补码,方法一求正数可行因为正数的补码与源码一致,而求负数的补码是反码加一,结果就会出错。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int num = 0;
int count = 0;
scanf("%d", &num);
while (num)
{
if (num % 2 == 1)
{
count++;
}
num = num / 2;
}
printf("%d\n", count);
return 0;
}
方法二://1的32位二进制数00000000000000000000000000000001
将num与1的二进制码按位取与,如果num第一位是1即结果为1,第一位为0则结果为0.再将1向左移,即可判断第二位,以此类推。但这里需要进行32次循环,效率不高。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int num = 0;
int i = 0;
printf("请输入一个数");
scanf("%d", &num);
int count = 0;
for (i = 0; i < 32; i++)
{
if (num&(1 << i))
{
count++;
}
}
printf("二进制中1的个数=%d\n", count);
return 0;
}
方法三://
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int num = 0;
int i = 0;
printf("请输入一个数");
scanf("%d", &num);
int count = 0;
while (num)
{
count++;
num = num&(num - 1);
}
printf("二进制中1的个数=%d\n", count);
return 0;
}
num有多少个1就会进行多少次,则效率比方法二高。