1.题目描述
输入两个整数,求两个整数二进制格式有多少个位不同。
- 输入示例:
22 33
- 输出示例:
5
2.题目解析
-
预备知识
异或也叫半加运算,其运算法则相当于不带进位的二进制加法:二进制下用1表示真,0表示假,则异或的运算法则为:0⊕0=0,1⊕0=1,0⊕1=1,1⊕1=0(同为0,异为1),这些法则与加法是相同的,只是不带进位,所以异或常被认作不进位加法。
如果a、b两个值不相同,则异或结果为1。如果a、b两个值相同,异或结果为0。 -
解题思路:
两个数进行异或,将异或的结果与其减一进行与操作,直至为零,就是二进制不同位数的数量。 -
实例解释
-
22
和33
进行异或。
- 十进制数 二进制数 a 22 10110 b 33 100001 ⊕ 55 110111 - 然后数一下
1
的个数,个数为5
。
-
3.参考答案
#include <bits/stdc++.h>
using namespace std;
int main(){
int n = 0;
int m = 0;
scanf("%d%d",&n,&m);
int num = n^m;
int count = 0;
while(num != 0){
if(num & 0x1) ++count; // 判断右端第一位是不是1
num = num>>1; // 右移一位
}
printf("%d\n",count);
}
或者
#include <bits/stdc++.h>
using namespace std;
int main(){
int n = 0;
int m = 0;
scanf("%d%d",&n,&m);
int num = n^m;
int count = 0;
while(num != 0){
++count;
num = (num-1)#// 每次去除1位
}
printf("%d\n",count);
}
网友评论