題目內容
兩個整數之間的漢明距離指的是這兩個數字對應二進制位不同的位置的數目。
給出兩個整數 x 和 y,計算它們之間的漢明距離。
注意:
0 ≤ x, y < 231
示例:
輸入: x = 1, y = 4
輸出: 2
解釋:
1 (0 0 0 1)
4 (0 1 0 0)
↑ ↑
上面的箭頭指出了對應二進制位不同的位置。
解題方式一
這個題目讓我們求兩個數字的漢明距離,題目裏面有介紹兩個數字之間的漢明距離就是其二進制數對應位不同的個數,最簡單的辦法就是判斷兩個數的每個bit位值是否一致,將不一致的位數量記錄起來,這個就是漢明距離了
public class Solution {
public int HammingDistance(int x, int y)
{
var count = 0;
//循環判斷0~31位的Bit位置值是否一致
for (int i = 0; i < 31; i++, x >>= 1, y >>= 1)
{
//判斷當前Bit位置的值是否一致如果不一致就數量+1
//運算規則:0&0=0; 0&1=0; 1&0=0; 1&1=1
if ((x & 1) != (y & 1)) count++;
}
return count;
}
}
解題方式二
我們可以優化下上面的代碼,可以一開始進行一次異或【運算規則:0^0=0; 0^1=1; 1^0=1; 1^1=0;】這樣就可以得到兩個數的二進制差異值了,然後遍歷這個二進制差異值得到位置爲1的bit個數,這個就是漢明距離了
public class Solution {
public int HammingDistance(int x, int y)
{
var count = 0;
//將x和y值進行異或處理得到不同的bit位置
//運算規則:0^0=0; 0^1=1; 1^0=1; 1^1=0;
//因爲x和y都是大於等於0的元素,他異或後的值也是正數【0 ≤ x, y < 2^31】
var v = x ^ y;
//判斷是否還有bit位置爲1的元素
while (v > 0)
{
//判斷當前Bit位置值是否爲1如果是就將數量+1
//運算規則:0&0=0; 0&1=0; 1&0=0; 1&1=1;
if ((v & 1) == 1) count++;
//向右移動一位
v >>= 1;
}
return count;
}
}