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.执行结果
牛客上也是通过了:
好的本期就到这里了,我们下期见!