题目大意:计算两个整数的汉明距离(两个数的二进制位中不同的位置个数)
分析:位运算。计算汉明距离:只要统计两个数的异或中有几个1即可。比如1(0001)和4(0100),异或后(0101)就能显示出有几位不同。异或操作——0^1=1,0^0=0。
方法一:库函数。C++:return bitset<32>(x^y).count();JAVA:return Integer.bitcount(x^y);
方法二:移位。可以将两个数最右位不断&1并右移两个数,也可以将异或不断&1并右移。
方法三:布赖恩·克尼根算法。XOR & (XOR - 1)会将XOR最右的一个1移除。这样可以比逐个移位更快速的统计异或中1的个数。
代码:
方法二:
class Solution {
public:
int hammingDistance(int x, int y) {
int dist = 0;
while(x || y){
dist += (x & 1) ^ (y & 1);
x = x >> 1;
y = y >> 1;
}
return dist;
}
};
class Solution {
public:
int hammingDistance(int x, int y) {
int dist = 0;
int n = x ^ y;
while(n){
dist += n & 1;
n = n >> 1;
}
return dist;
}
};
方法三:
class Solution {
public:
int hammingDistance(int x, int y) {
int dist = 0;
int xor = x ^ y;
while(xor){
xor = xor & (xor - 1);
dist++;
}
return dist;
}
};