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

本文介绍了如何使用C语言通过三种不同的方法来统计一个整数二进制表示中的1的个数:除2法、逻辑运算与移位操作以及位操作法,并提供了相应的代码示例。
摘要由CSDN通过智能技术生成

目录

前言

一.第一种

二.第二种

三.第三种

总结


前言

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

  • 25
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值