2009-10-01 42 views
2

比方說,我有此位字段的值:10101001我怎麼能測試,如果兩個位模式中的任意N位不同(位置無所謂)

我會怎麼測試,如果任何其他值在任何n位不同。不考慮 的位置?

例子:

10101001 
10101011 --> 1 bit different 

10101001 
10111001 --> 1 bit different 

10101001 
01101001 --> 2 bits different 

10101001 
00101011 --> 2 bits different 

我需要做很多這樣的比較所以我主要是尋找性能比較,但任何 提示是非常受歡迎的。

回答

11

取兩個字段的XOR並對結果進行總體計數。

+0

[人口計數](HTTP:// EN。 wikipedia.org/wiki/Hamming_weight) – Cesar 2009-10-02 07:41:17

+1

即使這個問題確實指出了有多少位是不同的,據我所知,它只要求告訴兩個值是否在* some *位位置不同,而不是多少位位置是不同的。如果這個讀數是正確的,你不需要最終的人口數量,只需要直接檢查非零。 – 2010-04-13 22:57:48

5

如果將2個值異或,則只留下不同的位。

那麼你只需要數目前仍在1位,你有你的答案

在C:

unsigned char val1=12; 
unsigned char val2=123; 
unsigned char xored = val1^val2; 
int i; 
int numBits=0; 
for(i=0; i<8; i++) 
{ 
     if(xored&1) numBits++; 
     xored>>=1; 
} 

雖然有可能更快的方法來計算一個字節 位(例如,您可以使用256值的查找表)

1

對數字進行異或運算,則問題變成計算結果中1的問題。

4

就像其他人所說的那樣,使用XOR來確定有什麼不同,然後use one of these algorithms to count

+1

另請參閱:http://gurmeetsingh.wordpress.com/2008/08/05/fast-bit-counting-routing/ – James 2009-10-01 07:51:57

0

與其他人已經回答的情況一樣,使用XOR進行比較。

計數可以通過幾種方式進行:

  • 左移位和加法。
  • 在表中查找。
  • 邏輯公式,你可以找到Karnaugh maps
3

這得到的值之間的差位和計數位的三人臺時間:

public static int BitDifference(int a, int b) { 
    int cnt = 0, bits = a^b; 
    while (bits != 0) { 
     cnt += (0xE994 >> ((bits & 7) << 1)) & 3; 
     bits >>= 3; 
    } 
    return cnt; 
} 
+0

非常酷的把戲。儘管我花了一段時間來理解; ^) – Toad 2009-10-01 09:36:45

1

在Java:

Integer.bitCount(a^b) 
相關問題