两个整数之间的汉明距离指的是这两个数字对应二进制位不同的位置的数目。
给出两个整数 x 和 y,计算它们之间的汉明距离。
内置位计数功能
class Solution {
public int hammingDistance(int x, int y) {
return Integer.bitCount(x ^ y);
}
}
逐个移位
class Solution {
public int hammingDistance(int x, int y) {
int xor = x ^ y;
int distance = 0;
while (xor != 0) {
if (xor & 1 == 1)
distance += 1;
xor = xor >> 1;
}
return distance;
}
}
- 同样的思路,在异或得到 xor 后,可以选择不将 xor 逐位右移,而是用变量 flag = 1 ,每次右移flag,并和 xor 进行与运算
布赖恩·克尼根算法
- 方法二是逐位移动,逐位比较边缘位置是否为 1。寻找一种更快的方法找出等于 1 的位数。
- 遇到最右边的 1 后,如果可以跳过中间的 0,直接跳到下一个 1,效率会高很多。这是布赖恩·克尼根位计数算法的基本思想
class Solution {
public int hammingDistance(int x, int y) {
int xor = x ^ y;
int distance = 0;
while (xor != 0) {
distance += 1;
// remove the rightmost bit of '1'
xor = xor & (xor - 1);
}
return distance;
}
}