Leetcode题解 - 461. Hamming Distance

描述见链接

其实本质上很简单就是一个位运算的题目,将两个数按位异或之后统计二进制结果中的数字1的个数就行,代码如下:

class Solution {
public:
    int hammingDistance(int x, int y) {
    int z=x^y;
    int count=0;
    while((z!=0)){
        if(z%2==1)
            count++;
        z=z/2;
    }
    return count;
    }
};

其中转换为二进制统计1的个数直接循环除以2然后统计也可以AC,但是询问其他同学似乎会有问题,于是AC后看了下提供的代码,似乎用了一个位运算的技巧,

while (n >0 ) {
      count ++;
      n &= (n-1);
}

核心的循环写成了位运算的形式

n为奇数(n的二进制表示的末位为1):
n: xxxxxxxx1
n-1: xxxxxxxx0
n&(n-1): xxxxxxxx0
相当于去掉最右边的一个1。

n为偶数且不等于0(n的二进制表示的末位为0):
n: xxxxx1000
n-1: xxxxx0111
n&(n1-): xxxxx0000
也是相当于去掉最右边的一个1。

所以,程序的效果就是统计传入的参数的二进制表示中1的个数。

如,9999 的二进制表示为: 0010 0111 0000 1111,共有8个1.

显然,这样做的效率更高。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值