描述见链接
其实本质上很简单就是一个位运算的题目,将两个数按位异或之后统计二进制结果中的数字1的个数就行,代码如下:
class Solution {
public:
int hammingDistance(int x, int y) {
int z=x^y;
int count=0;
while((z!=0)){
if(z%2==1)
count++;
z=z/2;
}
return count;
}
};
其中转换为二进制统计1的个数直接循环除以2然后统计也可以AC,但是询问其他同学似乎会有问题,于是AC后看了下提供的代码,似乎用了一个位运算的技巧,
while (n >0 ) {
count ++;
n &= (n-1);
}
核心的循环写成了位运算的形式
n为奇数(n的二进制表示的末位为1):
n: xxxxxxxx1
n-1: xxxxxxxx0
n&(n-1): xxxxxxxx0
相当于去掉最右边的一个1。
n为偶数且不等于0(n的二进制表示的末位为0):
n: xxxxx1000
n-1: xxxxx0111
n&(n1-): xxxxx0000
也是相当于去掉最右边的一个1。
所以,程序的效果就是统计传入的参数的二进制表示中1的个数。
如,9999 的二进制表示为: 0010 0111 0000 1111,共有8个1.
显然,这样做的效率更高。