1.汉明距离
汉明距离是使用在数据传输差错控制编码里面的,汉明距离是一个概念,它表示两个(相同长度)字对应位不同的数量,我们以d(x,y)表示两个字x,y之间的汉明距离。对两个字符串进行异或运算,并统计结果为1的个数,那么这个数就是汉明距离。
2.汉明距离变形
求两个数的二进制中的不同位的个数,比如5(101)和3(011)汉明距离就是2,
3.解题思路
当我们看到求解两个数的二进制中的不同位的个数,我们很快能想到位运算,而且是按位异或运算(相同为0,相异为1),所以,我们将上例中的5(101)和3(010)异或,结果为(110),我们发现异或结果的二进制中的1的个数就是这两个数的汉明距离
所以问题变成了求解两个数的异或结果的二进制中的1的个数
这里直接给出求解两个数的异或结果的二进制中的1的个数的方法:
求解两个数的异或结果的二进制中的1的个数,直接用这个数,比如5(101)异或5-1,也就是4(100),得到结果为1(001),这样就去掉了5的二进制中的末位1,001异或,得到011异或一次去掉一个末位1,所以对于数字n,统计当n>=0时,n^=(n-1)的次数就是n的二进制中1的个数
int NumberOf1(int n) {
int count = 0;
while(n){
count++;
n&=(n-1);
}
return count;
}