leetcode-461.汉明距离

位运算


题目详情

两个整数之间的 汉明距离 指的是这两个数字对应二进制位不同的位置的数目。
给你两个整数 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);
    }
}

位运算常用技巧

位运算技巧

posted @ 2022-07-27 16:26  ggaoda  阅读(4)  评论(0编辑  收藏  举报  来源