461. 汉明距离
两个整数之间的汉明距离指的是这两个数字对应二进制位不同的位置的数目。 给出两个整数 x 和 y,计算它们之间的汉明距离。 注意: 0 ≤x
,y
< 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 :相当于删掉其他位而只保留最低位的数
总结:达到按位遍历的效果
2.python解法
return bin(x ^ y).count('1')