题目说明
两个整数之间的汉明距离指的是这两个数字对应二进制位不同的位置的数目。给出两个整数 x 和 y,计算它们之间的汉明距离。
注意: 0 ≤ x,y < 231
示例:
输入: x = 1, y = 4
输出: 2
解释:
1 (0 0 0 1)
4 (0 1 0 0)
↑ ↑
上面的箭头指出了对应二进制位不同的位置。
解题
题目分析:
- 两个整数之间的汉明距离指的是这两个数字对应二进制位不同的位置的数目
这里的意思就是将两个数用二进制表示,然后按位进行比较,记录下对应位置数字不同的数目,比如用它所给的实例:
解题思路:
由上图可以看出,将输入的两个数字 x 和 y ,第一步进行异或运算(^),然后得出值 n ,然后对求出 n 的二进制有几个 1 ,1 的个数就是 这两个数字对应二进制位不同的位置的数目,也就是汉明距离。
对于如何求 n 有几个 1 ,我这里给出两种方法:
方法一:
// 方法一
n = x^y; //两个数字异或得出来的数,二进制中1的个数就是汉明距离
// t=0; t 记录 n 中有几个 1
for(t;n!=0;t++)
{
// n 与 (n-1) 进行 & 运算,将得出来的值又赋值给 n
n &= (n-1); //可以得出 n 中有几个 1
}
可以得出 t = 2 ,即汉明距离为 2 。
方法二:
// 方法二
// 让 n 与 1 相 &,然后 n 向右移动一位
n = x^y; //两个数字异或得出来的数,二进制中1的个数就是汉明距离
while(n!=0)
{
t += (n & 1); //可以得出n中有几个 1
n >>= 1;
}
可以得出 t = 2 ,即汉明距离为 2 。
这两个方法,从原理上看是相似的,你可以根据需要选择其中一种方法。两种方法完整代码如下所示:
//方法一
#include<iostream>
using namespace std;
int main()
{
int x,y;
int n=0,t=0;
cin>>x>>y;
n=x^y; //两个数字异或得出来的数,二进制中1的个数就是汉明距离
for(t;n!=0;t++)
{
// n 与 (n-1) 进行 & 运算,将得出来的值又赋值给 n
n &= (n-1); //可以得出n中有几个 1
}
cout<<t<<endl;
return 0;
}
//方法二
#include<iostream>
using namespace std;
int main()
{
int x,y;
int n=0,t=0;
cin>>x>>y;
n=x^y; //两个数字异或得出来的数,二进制中1的个数就是汉明距离
while(n!=0)
{
// 让 n 与 1 相 &,然后 n 向右移动一位
t += (n & 1); //可以得出n中有几个 1
n >>= 1;
}
cout<<t<<endl;
return 0;
}