我的目標是取兩個數字,看它們之間的位數差異。二進制分隔距離(Java)
例如:
號碼A:01011 0111
數量B:11011 0101
這兩個數之間的差異將是2,因爲存在兩個比特是不同的。有沒有簡單的方法來做這個計算,而沒有制定一些大的算法來分解這兩個數字?
我的目標是取兩個數字,看它們之間的位數差異。二進制分隔距離(Java)
例如:
號碼A:01011 0111
數量B:11011 0101
這兩個數之間的差異將是2,因爲存在兩個比特是不同的。有沒有簡單的方法來做這個計算,而沒有制定一些大的算法來分解這兩個數字?
從0循環到要檢查的位數(我將選擇32),按當前「位索引」對兩個數字進行位移,如果按位AND 1
(獲取第一位)則遞增差值計數,這兩個數字是不同的。
public static int difference(int num1, int num2) {
int count = 0;
for (int i = 0; i < 32; i++) {
if (((num1 >> i) & 1) != ((num2 >> i) & 1)) count++;
}
return count;
}
實施例:
difference(0b010110111, 0b110110101); // result: 2
看取決於數據類型的位的數目:
long
- 64位int
- 32位short
- 16位byte
- 8位一個簡單的實現對雙方都是二進制數的每個字符轉換爲字符串和比較,像這樣:
int count = 0;
for(int i = 0; i < String1.length() && i < String2.length(); i++)
{
if(String1.charAt(i) != String2.charAt(i))
count++;
}
這是我能想到的最簡單的實現。
public static int difference(int num1, int num2) {
int count = 0;
int xor = num1^num2;
for (int i = 0; i < 32; i++) {
if ((xor >> i) & 1) count++;
}
return count;
}
這個版本從Hamming Distance Wikipedia article那兒剽竊:
public static int difference(int num1, int num2) {
int count = 0;
int xor = num1^num2;
while (xor != 0) {
count++;
xor &= xor - 1;
}
return count;
}
你並不需要一個 「大算法」,你可以只使用一個循環。 – 2014-11-22 18:53:31
你可能想Google「海明距離」。 – 2014-11-23 00:23:27
(您可以將兩個數字XOR在一起,然後計算結果中的1位。) – 2014-11-23 00:24:47