我的解决方案:(对于输入块的每一位,都有这样一行)

*parity ^= (((x[0] >> 30) & 0x00000001) * 0xc3e0d69f);

所有类型都是 uint32。该行获取输入 x 的第二位,将其移至 LSB 并将所有其他位设置为零。然后,将 32 位奇偶校验与为此位设置的相应奇偶校验进行异或。

我发现这种乘法解决方案是执行此条件 XOR 的最快方法。有没有更快的方法?

最佳答案

我不完全明白你的意思是什么奇偶校验,但如果这行代码是你想要的,它可能会得到改进。

一般规则:对于 x in {0, 1} x * N == -x & N

这是因为 -x 对于 0 是所有位重置,对于 1 是 -1,其中所有位都设置。

所以原来的代码行可以改写为:

*parity ^= (-((x[0] >> 30) & 0x00000001) & 0xc3e0d69f);

与许多微处理器上的乘法相比,哪两个运算的计算时间更短,但您应该检查一下。

代码也可以利用有符号右移
*parity ^= (((int32_t)x[0] << 1 >> 31) & 0xc3e0d69f);

首先将第 30 位 rshift 移到第 31 位,即符号位,然后第二个扩展所有其他位的符号位,因为在大多数机器上右移充本地板(x/2N),因此用符号位( abc...yz>>3 == aaaabc...yz )填充移位的位。

但是这些技巧在 C 标准中被称为 未定义行为 ,因此 不可移植 。小心使用它们。

关于c - 位运算计算奇偶校验的最快方法是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4208646/

10-12 02:44