奇数位的位奇偶校验码
Posted
技术标签:
【中文标题】奇数位的位奇偶校验码【英文标题】:Bit parity code for odd number of bits 【发布时间】:2011-11-23 17:47:43 【问题描述】:我正在尝试查找位串的奇偶性,以便如果 x 有一个奇数的 0 则它返回 1。 我只能使用基本的按位运算,到目前为止我已经通过了大部分测试,但我想知道两件事:
为什么 x ^ (x + ~1) 有效?我偶然发现了这一点,但如果有奇数位,它似乎给你 1,如果是偶数,它似乎给你 1。像 7^6 = 1 因为 7 = 0b0111
这是解决问题的正确方向吗?我假设我的问题源于第一个操作,特别是 (x + ~1),因为它会溢出某些 2 的补码。谢谢
代码:
int bitParity(int x)
int first = x ^ (x + ~1);
int second = first ^ 1; // if first XOR gave 1 you'll return 0 here
int result = !!second;
return result;
【问题讨论】:
你在哪里找到那个算法的? 不要使用int
,会有溢出,这是未定义的行为。请改用unsigned
和1u
,这里的环绕定义很好。
这个算法不起作用。它为 0 到 255 之间的所有值返回 1。
我对奇数位二进制数进行了异或运算、与运算,然后将它们与自身减去 1 进行或运算,而异或运算是唯一提供有用信息的函数(至少我是这么认为的)。
bitParity - Finding odd number of bits in an integer的可能重复
【参考方案1】:
据我所知,您的奇偶校验函数实际上并没有工作 - 它似乎在大约一半的时间里得到了正确的答案,这与返回随机结果一样好(或者甚至只返回 0 或 1时间)。
确实有几个位级别的 hack 实际工作:http://graphics.stanford.edu/~seander/bithacks.html#ParityNaive - 你可能想看看最后一个:http://graphics.stanford.edu/~seander/bithacks.html#ParityParallel
【讨论】:
我意识到我的完整代码不起作用,但 x ^ (x-1) 似乎给出了对我尝试的值有意义的答案。如果你是正确的,那么我应该把它转储并重新开始。 只需尝试输入值 0、1、2 和 3,您会发现它不起作用。【参考方案2】:我会使用实际计数,而不是利用数字表示的位级黑客,这样既感觉更安全,又更干净、更容易理解。当然,可能会更慢,但这是一个相当不错的折衷方案,尤其是当人们对性能预期一无所知时。
这样做,只需编写代码来计算 1 的位数,最直接的解决方案通常归结为循环。
更新:鉴于(奇怪和烦人的)限制,我的回应可能是unwindbithacks 页面上"naive" 解决方案中给出的循环。那不会很漂亮,但我可以去做一些有用的事情。 :)
【讨论】:
我当然会使用循环来轻松计算每个位,甚至只是对所有位进行异或运算,但是对于这个分配,我不允许使用控制结构。只是 | ^ & >> 我采用了以前编写的代码进行位计数,并将结果与 0x1 相加,以查看是否有奇数位。但是,我通过蛮力执行了 bitCount(int x) 算法;用 !!(x & (1 【参考方案3】:位奇偶校验可以这样完成:
#include <stdio.h>
int parity(unsigned int x)
int parity=0;
while (x > 0)
parity = (parity + (x & 1)) % 2;
x >>= 1;
int main(int argc, char *argv[])
unsigned int i;
for (i = 0; i < 256; i++)
printf("%d\t%s\n", i, parity(i)?"odd":"even");
【讨论】:
以上是关于奇数位的位奇偶校验码的主要内容,如果未能解决你的问题,请参考以下文章