Utilisez une table de correspondance. Il n'y a que 256 valeurs possibles après XORing, donc cela ne va pas prendre beaucoup de temps. Contrairement à la solution d'izb, je ne suggérerais pas de mettre toutes les valeurs manuellement - calculons la table de recherche une fois au démarrage en utilisant l'une des réponses en boucle.
Par exemple:
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];
}
}
(Vous pourrait faire une méthode d'extension si vous vouliez vraiment ...)
Notez l'utilisation de byte[]
dans la méthode CountBitsAfterXor
- vous pourrait en faire un IEnumerable<byte>
pour plus de généralité, mais itérer sur un tableau (qui est connu pour être un tableau au moment de la compilation) sera plus rapide. Probablement plus rapide microscopiquement, mais bon, vous avez demandé le plus rapide façon :)
Je certainement effectivement exprimer comme
public static int CountBitsAfterXor(IEnumerable<byte> data)
dans la vie réelle, mais voyez ce qui fonctionne mieux pour vous .
Notez également le type de la variable xor
en tant que int
. En fait, il n'y a pas d'opérateur XOR défini pour les valeurs byte
et si vous avez fait xor
un byte
il compilerait encore en raison de la nature des opérateurs d'affectation composés, mais il effectuerait un cast à chaque itération - au moins dans l'IL.Il est tout à fait possible que le JIT prenne soin de cela, mais il n'est même pas nécessaire de le demander :) :)
Merci, en attente d'exemple de code ou de lien .. –
Merci beaucoup pour votre réponse. –