计算机中数的存储是以二进制补码的形式存储的
此题只讨论正整数
方法一.
算法思路:一个数二进制形式可以用短除法得到,要想知道二进制中有多少个1,每除一次可以判断此次余数是否为1,若为1,count++,要注意循环结束条件。
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
int Fun(int i)
{
int count = 0;
while (i != 0)
{
if (i%2 == 1)
{
count++;
}
i = i / 2;
}
return count;
}
int main()
{
int i = 0;
printf("请输入一个数:", i);
scanf("%d", &i);
int b = Fun(i);
printf("%d\n", b);
system("pause");
return 0;
}
方法二.
算法思路:此题也可以用移位操作来完成。一个数二进制形式怎么得到里面1的个数,此时可以用这个数来和1进行与运算,如果与完结果为1,就证明最右边数为1,计数器加1,然后将数右移一位,让移位完的数再与上1,结果为1,计数器加1,依此循环,注意循环结束条件,也就是移位次数要知道。
例如:
输入为5
00000000 00000000 00000000 00000101 //5的二进制形式
00000000 00000000 00000000 00000001 //1的二进制形式
00000000 00000000 00000000 00000001 //相与结果为1
与完结果为1,证明输入的数最右边一位为1 count++
计数完之后将数右移一位
00000000 00000000 00000000 00000010 //右移一位
00000000 00000000 00000000 00000001 //与上1
00000000 00000000 00000000 00000000 //结果为0
证明此时最右边一位为0,不用计数
以此类推
代码如下:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
int Fun(int i)
{
int x = 0;
int count = 0;
while (x < 32)
{
if (i & 1 == 1)
{
count++;
}
i = i >> 1;
x++;
}
return count;
}
int main()
{
int i = 0;
printf("请输入一个数:", i);
scanf("%d", &i);
int b = Fun(i);
printf("%d\n", b);
system("pause");
return 0;
}