让 v 和 w 是两个位串。在当前应用程序中,它们由 8 位组成。我正在寻找计算以下表达式的最快方法。
x = (v[1] & w[0]) ^ (v[2] & w[1]) ^ (v[2] & w[0]) ^ (v[3] & w[2]) ^ (v[3]) & w[1]) ^ (v[3] & w[0]) ^ ...
关于这个主题的一些想法:我注意到的一件事是这个表达式也可以写成如下。让
P(w[k]) = w[k] ^ w[k-1] ^ ... ^ w[0]
表示 w 的最低k + 1
位的奇偶性。然后
x = (v[1] & P(w[0])) ^ (v[2] & P(w[1])) ^ (v[3] & P(w[2])) ^ ... ^ (v[7] & P(w[6]))
现在 ifPw
是一个位串,其中每个位表示低位的奇偶校验,即Pw[i] = P(w[i-1])
thenx
可以写如下:
x = P(v & Pw)
现在,在http://graphics.stanford.edu/~seander/bithacks.html我找到了一种快速计算字符串奇偶性的方法,但是为了基于此构建快速算法,我还需要快速计算上述位串的方法Pw
。
或者也许我完全以错误的方式处理这个问题,有很多奇偶校验计算要以这种方式完成。如果这确实是要走的路,我想知道是否有可能(假设程序将在 x86 上运行)在汇编中使用奇偶校验标志来加速计算。
最后,这将是我正在开发的应用程序中大量需要的计算,因此速度真的很重要。我想知道是否可以在寄存器中完成整个计算,以及这是否比在内存中创建查找表更快。