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);
    }
}

位运算常用技巧

位运算技巧

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ggaoda

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值