题目:
输入一个整数,输出这个整数二进制形式中1的个数。
例如:
输入:115
输出:5
解题思路:
方法一:
关键代码:i = i & (i-1),统计i二进制中有多少个1
具体是如何实现的,实际推几步就可以看出规律。例如2017的二进制形式为11111100001
第一步,11111100001 & 11111100000 = 11111100000 count = 1
第二步,11111100000 & 11111011111 = 11111000000 count = 2
......
每一步结果都会减少一个二进制中的1,并且计数加一,实际上是在统计二进制中1的个数。
方法二:
要求一个数的二进制形式中1的个数,那么首先想到的是求其二进制。常用的方法为除二取余法,当得到的余数为1时,计数加一,从而实现题目要求。
方法三:
根据题目的要求,我想到了逐位去判断是否为1,若是的话则计数加一。那么就需要用到位运算的知识,我们知道1按位与上一个数不改变这个位,0按位与上一个数将这个位零。那么我只需将1不停左移并按位与上要判断的数每一位,就可以得到这个数二进制形式中1的个数。
程序代码:
方法一:
#include <stdio.h>
int return_1(unsigned int);
int main(int argc, char *argv[])
{
unsigned int num = 0;
printf("请输入一个整形数据:");
scanf("%u",&num);
printf("该数据二进制中1的个数为:%d\n",return_1(num));
return 0;
}
int return_1(unsigned int num)
{
int count = 0;
while(num){
num = (num)&(num-1);
count++;}
return count;
}
方法二:
#include <stdio.h>
int return_1(unsigned int);
int main(int argc, char *argv[])
{
unsigned int num = 0;
printf("请输入一个整形数据:");
scanf("%u",&num);
printf("该数据二进制中1的个数为:%d\n",return_1(num));
return 0;
}
int return_1(unsigned int num)
{
int count = 0;
while(num){
if(num % 2 == 1){
count++;
}
num = num / 2;
}
return count;
}
方法三:
#include <stdio.h>
int return_1(unsigned int );
int main(int argc, char *argv[])
{
unsigned int num = 0;
printf("请输入一个整形数据:");
scanf("%u",&num);
printf("该数据二进制中1的个数为:%d\n",return_1(num));
return 0;
}
int return_1(unsigned int num)
{
int count = 0;
int i = 0;
while(i++ < 32)
if(((1 << i) & num) != 0)
count++;
return count;
}
运行结果:
请输入一个整形数据:643698459
该数据二进制中1的个数为:16
标签:count,return,二进制,个数,unsigned,整数,int,num
From: https://blog.csdn.net/a921876874/article/details/143099814