C语言 用三种方法求一个整数二进制位中1的个数

发布时间:2024年01月24日

目录

前言

一.第一种

二.第二种

三.第三种

总结


前言

? ?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的个数,如果有错误欢迎指出,如果有帮助,不要忘了点赞,蟹蟹。

文章来源:https://blog.csdn.net/2301_81565958/article/details/135718604
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。