求兩個數的二進位位不同的位置,最先想到的就是 異或操作 , 異或:按位運算,相同為0,不同為1。 比如: a = 6 對應的二進位表示為: 0 0 1 1 1 b = 9 對應的二進位表示為: 0 1 0 0 1 則 a ^ b = 14 對應的二進位表示為: 0 1 1 1 0 所以,只要算出 ...
求兩個數的二進位位不同的位置,最先想到的就是異或操作,
異或:按位運算,相同為0,不同為1。
比如:
a = 6 對應的二進位表示為: 0 0 1 1 1
b = 9 對應的二進位表示為: 0 1 0 0 1
則 a ^ b = 14 對應的二進位表示為: 0 1 1 1 0
所以,只要算出異或之後的數的二進位表示方法裡面1的個數。
比如,對於上面的異或之後為14,14的二進位裡面1的個數為3,那麼漢明距離就是3。
想知道是否有1,最快的當然還是位與操作,
與:按位運算,相當於乘法,0與0是0,1與0是0,0與1是0,1與1是1。
所以,任何值與1相與,得到的就是就是原值二進位的最後一位,
要麼是1,要麼是0,
這樣就能得到原值的最低位是否是1。
然後再把原值整體右移一位,再查看最低位是否是1,
迴圈往複,就能夠算出原值二進位裡面1的個數了。
附上代碼:
int hammingDistance(int x, int y){
int iDistance = 0;
unsigned int uiXor;
uiXor = x ^ y;
while (uiXor > 0)
{
if (uiXor & 1)
{
iDistance ++;
}
uiXor >>= 1;
}
return iDistance;
}