java,算汉明距离,leetcode上这个最快的算法是什么意思,求指点

public int hammingDistance(int x, int y) {
int hamming = x ^ y;
int cnt = 0;
while(hamming > 0){
hamming = hamming & (hamming - 1);
cnt++;
}
return cnt;
}


第一句相异还明白的,但是当hamming大于0,然后用hamming去和hamming-1按位相和就不懂了,为什么这样就能算出来?

while(hamming > 0){
hamming = hamming & (hamming - 1);
cnt++;
}
这一段是计算hamming有多少个1,hamming & (hamming - 1);相当于每次都把二进制的一个1消除了, 比如 hamming 二进制为1111;
则hamming & (hamming - 1) = 1110,下次循环就变成了 1100.。。依次类推,最后就是4

首先要明白一个原理:如果一个数中只有一个1,那么将它减1后,原来1的位置变为0,比1所在位置低的位置全部变为1。

比方说原来是1000,则1000-1=0111,这样,1000&0111=0。

如果有多个1,则高位1是不会变的。比如111000-1=110111。高位的11没有动,只有低4位的1000变成了0111.

所以hamming & (hamming - 1)的意思就是将最低位的1置0.

 比较两个二进制数字中不一样的数据,其实可以直接将两个数字取异或,然后再求出异或结果的二进制形式中有多少个1即可。

int hammingDistance(int x, int y) {
    int i = x ^ y;
    int count=0;
    while (i != 0) {
        ++ count;
        i = (i-1)& i;
    }
    return count;
}