题目描述
两个整数之间的汉明距离指的是这两个数字对应二进制位不同的位置的数目。
给出两个整数 x 和 y,计算它们之间的汉明距离。
注意:
0 ≤ x, y < 2^31.
示例:
输入: x = 1, y = 4
输出: 2
思路分析
两个思路
- 思路一:计算两个数不同的位数就是汉明距离。通过每个位和1与进行计算,进行无符号右移。
- 思路二:将两数异或,剩下的就是不同的位数为1,计算1的位数距离就是汉明距离。
代码实现
/**
* 每次无符号右移,找到不同的位的个数就是汉明距离
* @param x
* @param y
* @return
*/
public static int hammingDistance(int x, int y) {
int count = 0;
while (x != 0 && y != 0) {
if ((x & 1) != (y & 1)) {
count++;
}
x >>>= 1;
y >>>= 1;
}
while (x != 0) {
count = (x & 1) == 1 ? count + 1 : count;
x >>>= 1;
}
while (y != 0) {
count = (y & 1) == 1 ? count + 1 : count;
y >>>= 1;
}
return count;
}
/**
* 两数异或,剩下的就是不同的位为1
* n & n-1,会将n最右的1位变成0
* 从而计算两者距离
* @param x
* @param y
* @return
*/
public static int hammingDistance1(int x, int y) {
int tmp = x ^ y;
int count = 0;
while (tmp != 0) {
count++;
tmp &= (tmp - 1);
}
return count;
}