目录
? ?Hello!大家好,也是好久没写博客,感觉自己实在是有点懒,希望通过写博客的方式来加强自己的知识记忆和督促自己学习,好了,废话不多说,今天来讲一下C语言中用三种方法求一个整数二进制位中1的个数。
? ? 根据十进制转二进制的原理,首先我们先让要判断一下我们要求的数除以2的余数是否等于1,如果等于1则我们就可以知道这个数的二进制数从右向左的第一位数是1,再让这个数除以2,相当于其二进制数减去一位,在从之前的判断操作,每次判断为1时,我们可以用一个变量记录下来,直到除二后的数字为0,这里上代码,代码后写了注释。
#include<stdio.h>
int two(unsigned a) //因为有正整数和负整数,所以这里就用无符号整形定义
{
int count = 0;
int b;
while (a != 0)//循环除二直到为0为止
{
b = a % 2;
if (b == 1)//如果余数为1,就说明该二进制位上的数为1
count++;//用一个变量记录下来
a /= 2;
}
return count;
}
int main() //主函数
{
int a;
scanf("%d", &a);
int n = two(a);
printf("有%d个1", n);
}
? ? 第二种方法用到了逻辑运算符和移位操作符,我们可以将要求的数按位与上一个1,判断得到地数是否为1,如果为1,则这位上是1,然后再用右移操作符移去一位,再按位与1,这里解释一下,((假设3按位与1)00000000000000000000000000000011
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 00000000000000000000000000000001
会得到? ? ? ? ? ? ? ? ? ? ? ? ?00000000000000000000000000000001
因为1的二进制数只有最后一位为1,它按位与上任何数除最后一位数之外都会变成0,从而可以判断这个数的最后一位是否为1。再用右移操作符移去一位继续判断,直到把32位都判断完)
重复之前的操作,因为一个整数的二进制最多为32位,所以重复32次就可以了,这里上代码。
#include<stdio.h>
int two(int a)//因为用了移位操作符不用考虑正负
{
int i;
int count = 0;定义一个变量记录
for (i = 0; i < 32; i++)//循环32次
{
if (((a >> i) & 1) == 1)
count++;
}
return count;
}
int main() //主函数
{
int a;
scanf("%d", &a);
int n = two(a);
printf("有%d个1", n);
}
? ? 第三种方法和第二种方法有点像,这里直接解释不太好解释,直接上代码加上注释
#include<stdio.h>
int two(int a)
{
int count = 0;
while (a)//a为0时停止循环
{
a = a & (a - 1);//将a按位与上a-1,就相当于把二进制数上的最后一个为1的位上,把1变成0,再赋值给a,重复这个操作,直到把每一个为1的位都变成0。
count++;
}
return count;
}
int main()
{
int a;
scanf("%d", &a);
int n = two(a);
printf("有%d个1", n);
}
这就是C语言中用三种方法求一个整数二进制位中1的个数,如果有错误欢迎指出,如果有帮助,不要忘了点赞,蟹蟹。