1. 程式人生 > >LeetCode:求兩個整數的漢明距離

LeetCode:求兩個整數的漢明距離

The Hamming distance between two integers is the number of positions at which the corresponding bits are different.

Given two integers x and y, calculate the Hamming distance.

該題即求兩個整數的漢明距離,比如輸入x=1, y=4, 則x的二進位制表示為001,而y的二進位制表示為100,而兩個整數漢明距離的定義則是這兩個整數的二進位制表示中,不同的二進位制位的個數,即在上面的例子中,由於001和100有2位不同,則它們之間的漢明距離為2。

解法一:簡單粗暴法

將兩個整數分別轉成二進位制,再分別比較每一位,若當前位不同,則距離加1,再比較接下來的一位。這種方法需要遍歷二進位制數中的所有位。

解法二:使用異或和n&(n-1)技巧

對兩個二進位制數進行異或,得到的結果中某位為1,則對應的原來兩個數中該位是不同的。

而使用n&(n-1)可以使得n的二進位制數表示中最後一位1變成0。例如n=110, n-1=101, 則n&(n-1)=100。

綜上,可以對兩個數進行異或之後使用n&(n-1)技巧計算不同的位數。這種方法無需遍歷二進位制數中的所有位, 只比較不同的位。

程式碼如下:

class Solution {
public:
    int hammingDistance(int x, int y) {
        int z = x^y;
        int count = 0;
        while(z){
            ++ count;
            z &= z-1;
        }
        //cout << z << endl;
        return count;
    }
};