首先,我们应该知道整数在内存中的存储形式为其补码
。
1.常规性:
#include<stdio.h>
#include<string.h>
#define _CRT_SECURE_NO_WARNINGS1
int main()
{
int num = 0;
int count = 0;//统计1的个数
scanf_s("%d", &num);
while (num)
{
if (num % 2 == 1)
count++;
num = num / 2;
}
printf("%d\n", count);
return 0;
}
与此同时,我们可以调用一个函数,其本质和以上代码相同
2.函数的调用:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>//system库函数的头文件
#define _CRT_SECURE_NO_WARNINGS1
int count_bit_one(int i,int count)
{
while (i)
{
if (1 == (i % 2))
{
count++;
}
i = i / 2;
}
return count;//千万不要忘记返回值
}
int main()
{
int i = 0;
scanf_s("%d", &i);
int count = 0;
count = count_bit_one(i,count);
printf("count = %d\n", count);
system("pause");//system执行系统命令 pause为暂停
return 0;
}
看到以上代码,你会想:***,终于写完了,其实上面的代码存在问题,它只能执行 正数,负数不能执行,因此我们要对代码做出修改。下面我们均采用函数调用进行改写。
改动点如下:
第一种改法:将上面的 第5行(函数的声明中)将 int i 改为 unsigned int i
第二种改法:将函数的递归部分改为:
int count = count_bit_one(int i,int count)
{
int n=0;
for(n=0;n<32;n++)
{
if(1==(i>>n)&1)//移位,让二进制的每一位都与1按位与运算
{
count++;
}
}
return count;
}
对比以上写法,你是不是还可以再找出一种更为简单的写法呢?
int count_bit_one(int i,int count)
{
while (i)
{
i=i&(i-1);//直到运算到0000才结束
count++;
}
return count;//千万不要忘记返回值
}