奇数位的位奇偶校验码

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,会有溢出,这是未定义的行为。请改用unsigned1u,这里的环绕定义很好。 这个算法不起作用。它为 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");
    

【讨论】:

以上是关于奇数位的位奇偶校验码的主要内容,如果未能解决你的问题,请参考以下文章

奇偶效验码和海明码

奇偶校验码的特点是啥?为啥说它是可靠性代码?

确定 MIPS 中数字的位表示的奇偶校验

奇偶校验,海明码与crc码

奇偶校验码 ,奇偶校验码检错原理,奇偶校验码的缺点。

检错与纠错码