@TOC

设计思路

&(按位与)的定义是,只有两个数的二进制位的同一位都为1才得1,
为了知道一个未知数的二进制位中含有1的个数,我们可以将它的每一位,依次进行对比,若都为1则计数一次,直到统计完成后,计数的次数即为1的个数。
如此我们可以整理出这么一个思路

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
//求一个整数存储在内存中的二进制中1的个数
int main()
{
    int a = 0;
    scanf("%d", &a);
    int count = 0;
    int b = 1;
    while (1)
    {
        //进行循环,一旦满足某一位是1,则count++
    }
    printf("二进制中1的个数为%d", count);
    return 0;
}

在此基础上我们可以编写好while内部的代码:
为了让程序更为精炼,在while循环的判断条件上,我们改为

(a / b ! = 0)

这样a的二进制位的最高位前的为0的位数就不用进行计算,更早的结束循环,减少程序的运行次数

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
//求一个整数存储在内存中的二进制中1的个数
int main()
{
    int a = 0;
    scanf("%d", &a);
    int count = 0;
    int b = 1;
    while (a / b != 0)
    {
        if ((a & b) == b)
        {
            count++;
        }
        b = b << 1;
        //或者b *= 2;  也行,此处因为不会溢出,没有影响。
    }
    printf("二进制中1的个数为%d", count);
    return 0;
}