最开始的思路:将x,y都右移一位分别计算异或值。
public int hammingDistance(int x, int y) {
int res=0;
// 当x , y 都不为0时可以继续
while(x!=0 || y!=0){
// 计算最右边的值
int tmp_x = x&1;
int tmp_y = y&1;
if((tmp_x ^ tmp_y)== 1){
res++;
}
x = x>>1;
y = y>>1;
}
return res;
}
上面的时间复杂度很简单,但是开辟了空间,因此改进空间的消耗,代码如下:
我们可以先计算x ^ y 的值,记为 z;然后再每次计算最右边一位;那么怎么检验呢,我们知道,最右边一位的值为1;所以如果为1,那么 z 一定是个奇数。
public int hammingDistance(int x, int y) {
int res = 0;
int z = x ^ y;
while(z != 0){
if(z%2 == 1){
res++;
}
z = z>>1;
}
return res;
}