前言:
今天系统复习了操作符,在牛客网上做了一道很有意思的题,我将这道题的链接也放在下面,大家有兴趣也可以去做一下。
正文:
现在在这里跟大家分享一下我的解题思路:
这道题目,要求我们输入两个整数,求两个整数二进制格式有多少位不同。
我们都知道,一个整型是4个字节,1个字节=8bit,所以一个整型共有32位。而二进制只有0和1的区别,那么是不是可以说我们要区分的就是两个整数在对应的二进制位上是0还是1的问题?位的不同也就是对应位上数的不同。
举个二进制的位数的例子:
关于5和3的二进制位数的表达
![]()
关于整数的二进制的表示方法有原码、补码、反码的区分,这里我们并不做过多的赘述,
这道题我认为有一种很好的解题思路就是关于位操作符的使用。
位操作符:&、|、^
我们现在简单的回顾一下位操作符,位操作符有三种:按位与:&、按位或:|和按位异或:^。那他们分别有什么不同呢?、
简单来说按位与:&是有0为0,全1为1;按位或:| 是有1为1,全0为0;按位异或:^则是相同为0,相异为1;
思路:
了解了这些,那么题目就很简单了。
假设两个整数为a和b,我们完全可以让a^b,再定义一个变量c来接收新的二进制位,那么各个位置相同的为0不同的为1,那么是不是就将a和b位不同的位置给找了出来?
接下来我们只需要得到c的二进制位中的1的数量,是不是就得到了有多少位不同了?
以上面的5和3为例:
那么接下来的难点就是如何收集c的二进制位中的1的数量。
上面我们讲到,&是有0为0,全1为1。我们又知道1的二进制位数中只有一个1,那么我们让c的每一位与1的末位进行比较,是不是就能得到1的个数了?
实际代码:
我们在左移1的二进制位,让1的末位去与c的每一位去比较,如果有>0的(也就是1),count就+1,最后返回count的个数,就是两个整数的二进制位不同的数的个数。