问题:
The Hamming distance between two integers is the number of positions at which the corresponding bits are different.
Given two integers x
and y
, calculate the Hamming distance.
Note:
0 ≤ x
, y
< 2^31.
Example:
Input: x = 1, y = 4 Output: 2 Explanation: 1 (0 0 0 1) 4 (0 1 0 0) ? ? The above arrows point to positions where the corresponding bits are different.
解决:
【注】题目要求的海明距离实际上是指两个二进制数对应位不相同的个数
① 根据异或的性质:相同为0,不同为1。所以先求出异或的结果,然后计算结果中1的个数。
class Solution { // 11ms
public int hammingDistance(int x, int y) {
if(x == y) return 0;
int count = 0;
int tmp = x ^ y;
while(tmp != 0){
tmp = tmp & (tmp - 1);
count ++;
}
return count;
}
}
② 直接调用java中的方法计算1的个数。
class Solution { // 15ms
public int hammingDistance(int x, int y) {
return Integer.bitCount(x ^ y);
}
}
③ 在网上看到一种递归的写法,递归终止的条件是当两个数异或为0时,表明此时两个数完全相同。我们返回0,否则我们返回异或和对2取余加上对x>>1和y>>1调用递归的结果。异或和对2取余相当于检查最低位是否相同,而对x>>1和y>>1调用递归相当于将x和y分别向右移动一位,这样每一位都可以比较到,也能得到正确结果。
class Solution { // 10ms
public int hammingDistance(int x, int y) {
if((x ^ y) == 0) return 0;
return (x ^ y) % 2 + hammingDistance(x >> 1,y >> 1);
}
}