c# - 计算字节数组中位和的最快方法

标签 c# arrays byte bit

我有两个长度相同的字节数组。我需要在每个字节之间执行异或运算,然后计算位和。

例如:

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/

相关文章:

c++ - 从文件中读取位

c# - 在ForEach语句中使用linq

c# - Oxyplot C# DateTimeAxis 在图表中显示点数据

c# - 将 int[] 数组转换为 ushort[] 数组

c# - 包含永无止境任务的对象会被垃圾回收吗?

c++ - 指针/引用数组?

c - 二维数组在没有被操纵的情况下丢失值?

java - 在数组中查找重复的字符串元素并计算该元素在java中的出现次数

java - 如何访问DataInputStream?

java - 在 Java 中将字节转换为 int