码迷,mamicode.com
首页 > 其他好文 > 详细

461. 汉明距离

时间:2018-12-03 15:42:06      阅读:175      评论:0      收藏:0      [点我收藏+]

标签:div   解法   最大   bsp   遍历   ++i   target   验证   不同   

两个整数之间的汉明距离指的是这两个数字对应二进制位不同的位置的数目。
给出两个整数 x 和 y,计算它们之间的汉明距离。

注意:
0 ≤ xy < 2^31.

示例:
输入: x = 1, y = 4
输出: 2
解释:
1   (0 0 0 1)
4   (0 1 0 0)
       ↑   ↑

上面的箭头指出了对应二进制位不同的位置。

 

【疑问】

1.x,y最大2^31,如何把这么大的数字拆成二进制呢?

考虑一下任意一个数字P,对于 0 ≥ P ≤ 2^31 ,转换成二进制后的二进制位数一定是不大于31位的(思考一下2^31这个数用二进制怎么表示),因此可以用长度为(31+1)的数组来表示这个数字P。

2.如何按位遍历一个整数P呢?

//伪代码
for (int i = 0; i < 32; ++i) {   第i位: P & (1 << i) }
//说明
按位左移动 1<<i :相当于 1 * 2^i 运算
按位与运算:两位同时为“1”,结果才为“1”,否则为0

//验证:当P=10,二进制表示为1010
迭代i{
i=0; 1010 & 0001 = 0000
i=1; 1010 & 0010 = 0010
i=2; 1010 & 0100 = 0000
i=3; 1010 & 1000 = 1000
... //之后到高位都是0
}

 

【其他解法分析】

1.

class Solution {
public:
    int hammingDistance(int x, int y) {
        int res = 0, exc = x ^ y;
        for (int i = 0; i < 32; ++i) {
            res += (exc >> i) & 1;
        }
        return res;
    }
};

1.
exc = x ^ y :先异或得到新的一组二进制数Q,对于Q中的每一位q
  q=1:对应二进制位不同
  q=0:对应二进制位相同
2. res += (exc >> i) & 1;
  exc每次按位右移一位:相当于依次把每一位的数放在最低位上
  (exc>>1) & 1 :相当于删掉其他位而只保留最低位的数
  总结:达到按位遍历的效果

 

 

 参考:http://www.cnblogs.com/grandyang/p/6201215.html

461. 汉明距离

标签:div   解法   最大   bsp   遍历   ++i   target   验证   不同   

原文地址:https://www.cnblogs.com/remly/p/10058067.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!