https://leetcode.com/problems/hamming-distance/description/
题目:将两个二进制数比较,输出不同位数的个数
思路:异或运算
class Solution {
public:
int hammingDistance(int x, int y) {
int sum = 0;
for(int z=0;z<32;z++){
sum+=abs(((x<<31)^(y<<31))>>31); //右移时补1,所以需要取绝对值
x = x>>1;
y = y>>1;
}
return sum;
}
};
另一种更快的方法:
class Solution {
public:
int hammingDistance(int x, int y) {
int sum = 0;
x = x ^ y;
while(x){
sum ++;
x -= (x&(-x));
}
return sum;
}
};
(x&(-x)可以求出1所在的最低位置。比如 x = 5 (0101)
x x&(-x) x -(x&(-x))
5(0101) 1(0001) 4(0100)
4(0100) 4(0100) 0(0000)
结束
从上面可以看出,只需要求解2次即可。