Utilizzare una tabella di ricerca. Ci sono solo 256 valori possibili dopo XORing, quindi non ci vorrà molto tempo. A differenza della soluzione di izb, tuttavia, non suggerirei di inserire manualmente tutti i valori: calcolare la tabella di ricerca una volta all'avvio utilizzando una delle risposte di loop.
Ad esempio:
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];
}
}
(È potrebbe renderlo un metodo di estensione se si voleva davvero ...)
Nota l'uso della byte[]
nel metodo CountBitsAfterXor
- si poteva renderlo un IEnumerable<byte>
per maggiore generalità, ma l'iterazione su un array (che è noto per essere un array in fase di compilazione) sarà più veloce. Probabilmente solo al microscopio più veloce, ma hey, avete chiesto il modo più veloce :)
avrei quasi certamente realtà esprimerlo come
public static int CountBitsAfterXor(IEnumerable<byte> data)
nella vita reale, ma vedere quale funziona meglio per voi .
Nota anche il tipo della variabile xor
come int
. Infatti, non esiste un operatore XOR definito per i valori byte
e, se è stato effettuato xor
a byte
, esso si compilerebbe comunque a causa della natura degli operatori di assegnazione composti, ma eseguirà un cast su ciascuna iterazione, almeno nell'IL.È possibile che la JIT si occupi di questo, ma non c'è nemmeno bisogno di chiederlo :)
fonte
2010-11-18 19:48:00
Grazie, aspettando codice esempio o collegamento .. –
Grazie mille per la risposta. –