题目
两个整数之间的汉明距离指的是这两个数字对应二进制位不同的位置的数目。
给出两个整数 x 和 y,计算它们之间的汉明距离。
示例:
输入: x = 1, y = 4
输出: 2
解释:
1 (0 0 0 1)
4 (0 1 0 0)
↑ ↑
上面的箭头指出了对应二进制位不同的位置。
解法
- 使用位运算异或
^
,让两个二进制数不同的位 置为1
- 统计数量的时候,去除最低位的
1
代码:
class Solution {
public int hammingDistance(int x, int y) {
// 对两个数字取异或,即不同的位 取值为1
int num = x^y;
// 统计次数
int count = 0;
while(num != 0){
// 消除最低位的 1
num = (num&(num-1));
count++;
}
return count;
}
}
为什么 num&(num-1)
可以去除 num
最低位的 1
呢?
例如二进制数
0010 1100
最低位 1
的左边都是 0
,如果减去 1 的话,那么最低位1
左边的 0
都会变为1
,而最低位的1
则会变为 0
0010 1011
此时再和原数 0010 1100
进行与(&
)运算,得到的结果就是
0010 1000
最低位的1
就被去掉了。
简单理解:
- 最低位
1
的左边都是0,一旦-1
操作,那么 左边的0都会变为1,而 最低位1
变为0 。 - 此时和原来的二进制数进行与运算的时候,之前的最低位
1→0
,最低位左边0→1
,所以他们&
运算的结果都是0。 - 因而最低位的
1
被消除了