输入两个整数,求两个整数二进制格式有多少个位不同

1.导语:

  牛客网中有这么一道题:

要求我们在两个int(32位)整数m和n的二进制表达中,求有多少个位(bit)不同


2.分析问题

当我们看到这个题,可能一开始会有点懵,但是仔细一想,我们关于二进制的符号总共只有几个:&、|、^、~、>>、<<等等,所以我们可以从这些符号去想,然后我们发现,好像中间有这么个符号,也就是异或“^”,我们回忆一下它的规则:相同为0,相异为1,这是一个重要的突破点,因为我们发现,可以通过查看1的个数,来发现有几个位数不同。


3.解决问题

知道了这些,我们就可以很简单的解决这个问题了,首先我们得定义几个变量,先是输入的两个数:m和n,然后我们需要一个变量来接收这个二进制数,我们定义为flag,然后还需要一个计数的变量,我们定义为count,接下来我们看看代码,解析也放在代码查看:

#include <stdio.h>
int main()
{
	int n = 0;
	int m = 0;
	int count = 0;
	int flag = 0;
	scanf("%d %d", &n, &m);//输入两个数
	flag = n ^ m;//flag接收n异或m的二进制序列,就是两者相异的数会变成1
	while (flag)
	{
		count++;
		flag = flag & (flag - 1); //使用这个来统计1的数量
	}
	printf("%d", count);//打印count的值就是两个数不同位数的值
	return 0;
}

4.补充知识点

我们在代码中看到一个:flag = flag & (flag - 1),这个玩意的效果是:每执行一次,就把n的二进制中最右边的1去掉,比如:

利用这个,我们就可以更快更巧妙的计算出1的个数。


5.执行结果

牛客上也是通过了:


好的本期就到这里了,我们下期见!

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

七分七分_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值