Verwenden Sie eine Nachschlagetabelle. Es gibt nur 256 mögliche Werte nach XORing, also wird es nicht lange dauern. Anders als bei der izb-Lösung würde ich jedoch nicht vorschlagen, alle Werte manuell einzugeben - berechne die Nachschlagetabelle einmal beim Start mit einer der loopenden Antworten.
Zum Beispiel:
public static class ByteArrayHelpers
{
private static readonly int[] LookupTable =
Enumerable.Range(0, 256).Select(CountBits).ToArray();
private static int CountBits(int value)
{
int count = 0;
for (int i=0; i < 8; i++)
{
count += (value >> i) & 1;
}
return count;
}
public static int CountBitsAfterXor(byte[] array)
{
int xor = 0;
foreach (byte b in array)
{
xor ^= b;
}
return LookupTable[xor];
}
}
(Sie könnte es eine Erweiterungsmethode, wenn Sie wirklich wollte ...)
Beachten Sie die Verwendung von byte[]
im CountBitsAfterXor
Methode - Sie konnte Machen Sie es für allgemeinere Zwecke zu einem IEnumerable<byte>
, aber das Iterieren über ein Array (das bei der Kompilierung als Array bekannt ist) wird schneller. Wahrscheinlich nur mikroskopisch schneller, aber hey, fragte sie die schnellste Weg :)
würde ich mit ziemlicher Sicherheit tatsächlich es ausdrücken als
public static int CountBitsAfterXor(IEnumerable<byte> data)
im wirklichen Leben, aber sehen, welche für Sie besser funktioniert .
Beachten Sie auch den Typ der xor
Variable als int
. Tatsächlich ist kein XOR-Operator für byte
Werte definiert, und wenn Sie xor
eine byte
gemacht hätten, würde es immer noch kompilieren aufgrund der Natur von Compound-Zuweisungsoperatoren, aber es würde bei jeder Iteration eine Umwandlung durchführen - zumindest in der IL.Es ist durchaus möglich, dass das JIT sich darum kümmern würde, aber es gibt keine Notwendigkeit, es sogar zu fragen :)
Danke, auf Code-Beispiel oder Link wartend .. –
Vielen Dank für deine Antwort. –