位运算
题目详情
两个整数之间的 汉明距离 指的是这两个数字对应二进制位不同的位置的数目。
给你两个整数 x 和 y,计算并返回它们之间的汉明距离。
示例1:
输入:x = 1, y = 4
输出:2
解释:
1 (0 0 0 1)
4 (0 1 0 0)
↑ ↑
上面的箭头指出了对应二进制位不同的位置。
示例2:
输入:x = 3, y = 1
输出:1
思路:
按位异或后统计有几个1
我的代码:
class Solution
{
public:
int hammingDistance(int x, int y)
{
// x^y将x和y不同位置1,其他都是0
int diff = x ^ y, ans = 0;
while (diff) // 循环按位判断(直到统计完)
{
ans += diff & 1; //末位是1就ans++
diff >>= 1; //右移一位继续判断
}
return ans;
}
};
我们发现上面的方法是逐位右移判断的,对于10001100,我们需要进行右移8位操作才能统计完,我们可以跳过0,利用:
n & (n - 1) 可以去除 n 的位级表示中最低的那一位,例如对于二进制表示 11110100,减去 1 得到 11110011,这两个数按位与得到 11110000
class Solution
{
public:
int hammingDistance(int x, int y)
{
int diff = x ^ y, ans = 0;
while (diff)
{
diff &= diff - 1; //去除最右侧的1
ans++;
}
return ans;
}
};
当然在实际应用中我们可以直接应用库中已有的函数:
// C++
class Solution {
public:
int hammingDistance(int x, int y) {
return __builtin_popcount(x ^ y);
}
};
//Java
class Solution {
public int hammingDistance(int x, int y) {
return Integer.bitCount(x ^ y);
}
}