我有两个长度相同的字节数组。我需要在每个字节之间执行异或运算,然后计算位和。
例如:
11110000^01010101 = 10100101 -> so 1+1+1+1 = 4
我需要对字节数组中的每个元素执行相同的操作。
最佳答案
使用查找表。 XORing 后只有 256 个可能的值,因此不会花费很长时间。不过,与 izb 的解决方案不同,我不建议手动将所有值放入 - 在启动时使用循环答案之一计算查找表一次。
例如:
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];
}
}
(如果你真的想要,你可以使它成为一个扩展方法......)
注意 byte[]
的使用在CountBitsAfterXor
方法 - 你可以使它成为 IEnumerable<byte>
为了更通用,但是迭代一个数组(在编译时已知是一个数组)会更快。可能只是在显微镜下更快,但是嘿,你要求的是最快的方式:)
我几乎可以肯定实际上将其表示为
public static int CountBitsAfterXor(IEnumerable<byte> data)
在现实生活中,但看看哪个更适合您。
还要注意 xor
的类型变量为 int
.事实上,没有为 byte
定义 XOR 运算符。值,如果你做了 xor
一个byte
由于复合赋值运算符的性质,它仍然可以编译,但它会在每次迭代时执行强制转换——至少在 IL 中是这样。 JIT 很可能会处理这个,但甚至没有必要要求它:)
关于c# - 计算字节数组中位和的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4218802/