编写代码,求一个整数在内存中的二进制中1的个数

时间:2022-11-18 10:00:41

首先,我们应该知道整数在内存中的存储形式为其补码


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;
}

看到以上代码,你会想:***,终于写完了,其实上面的代码存在问题,它只能执行  正数,负数不能执行,因此我们要对代码做出修改。下面我们均采用函数调用进行改写。

改动点如下:

第一种改法:将上面的  编写代码,求一个整数在内存中的二进制中1的个数 第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;//千万不要忘记返回值
}