Utilice una tabla de búsqueda. Solo hay 256 valores posibles después de XORing, por lo que no va a llevar mucho tiempo. Sin embargo, a diferencia de la solución de izb, no recomendaría poner todos los valores en su sitio manualmente: calcule la tabla de búsqueda una vez al inicio usando una de las respuestas de bucle.
Por ejemplo:
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];
}
}
(Usted podría que sea un método de extensión, si realmente quería ...)
Nota el uso de byte[]
en el método CountBitsAfterXor
- que podía hágala IEnumerable<byte>
para más generalidad, pero iterar sobre una matriz (que se sabe que es una matriz en tiempo de compilación) será más rápida. Probablemente sólo microscópicamente más rápido, pero bueno, en que pidió la manera más rápida :)
Me es casi seguro que en realidad expresarla como
public static int CountBitsAfterXor(IEnumerable<byte> data)
en la vida real, sino ver qué funciona mejor para usted .
También tenga en cuenta el tipo de la variable xor
como int
. De hecho, no hay ningún operador XOR definido para los valores byte
, y si hizo xor
un byte
aún se compilaría debido a la naturaleza de los operadores de asignación compuesta, pero estaría realizando un molde en cada iteración, al menos en el IL.Es muy posible que el JIT se ocupe de esto, pero no hay necesidad de preguntárselo :)
Gracias, esperando el ejemplo del código o el enlace. –
Muchas gracias por tu respuesta. –