Wie konnte ich testen, ob zwei Bitmuster in beliebigen N Bits unterscheidet (Position spielt keine Rolle)
-
19-09-2019 - |
Frage
Lassen Sie uns sagen, dass ich dieses Bit Feldwert haben: 10101001
Wie würde ich testen, ob ein anderer Wert in irgendwelchen n
Bits unterscheidet. Ohne zu bedenken
die Positionen?
Beispiel:
10101001
10101011 --> 1 bit different
10101001
10111001 --> 1 bit different
10101001
01101001 --> 2 bits different
10101001
00101011 --> 2 bits different
Ich brauche eine Menge dieser Vergleiche zu machen, so dass ich in erster Linie für die Perfomance der Suche bin, aber jeder Hinweis ist sehr willkommen.
Lösung
Nehmen Sie die XOR der beiden Felder und eine Bevölkerungszahl des Ergebnisses tun.
Andere Tipps
Wenn Sie die zwei Werte miteinander XOR, Sie sind mit den Bits nur links, die anders sind.
Sie müssen dann nur die Bits zählen, die noch 1 sind, und Sie haben Ihre Antwort
in 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;
}
obwohl es wahrscheinlich schnelle Möglichkeiten, um die Bits in einem Byte zu zählen (Sie könnte zum Beispiel eine LookupTable für 256 Werte verwenden)
Genau wie alle anderen auch gesagt, verwenden XOR, um zu bestimmen, was anders ist, und dann ein verwenden diese Algorithmen zählen .
Dies wird die Bit-Differenz zwischen den Werten und zählt die Bits drei auf einmal:
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;
}
die Zahlen XOR, dann wird das Problem darum, die 1s im Ergebnis zu zählen.
In Java:
Integer.bitCount(a ^ b)
Es wird ein Vergleich mit XOR durchgeführt, wie andere bereits beantwortet.
Zählen kann auf verschiedene Arten durchgeführt werden:
- Verschiebung nach links und zusätzlich.
- Nachschlagen in einer Tabelle.
- Logik Formeln, die Sie mit Karnaugh finden Maps .