从c中的字符串计算奇偶校验位

时间:2015-03-31 21:34:25

标签: c bitwise-operators parity

我正在尝试使用以下代码计算字符串中的奇偶校验位,我首先计算字符串的parityByte然后计算 我收集这些函数的那个​​字节的parityBit 应该做的伎俩,但我现在不太确定,我使用它们的程序失败了,我想现在,如果它是因为这些或我应该看看其他地方。

char calculateParity(char *payload, int size){
    char r = 0;
    int i;
    for(i = 0; i < size; i++){
        r ^= payload[i];
    }
    return calcParityBit(r);
}

char calcParityBit(char x){
    x ^= x >> 8;
    x ^= x >> 4;
    x ^= x >> 2;
    x ^= x >> 1;
    return x & 1;
}

4 个答案:

答案 0 :(得分:0)

作为@squeamish ossifrage条评论:使用unsigned char进行计算。由于char可能已签名,因此右移可能会复制符号位。

此外,代码通常运行效果最佳,返回值为intchar。建议使用返回值int或甚至只是bool

// Find parity (of any width up to the width of an unsigned)
int calcEvenParityBit(unsigned par, unsigned width) {
  while (width > 1) {
    par ^= par >> (width/2);  
    width -= width/2;
  }

  // Only return Least Significant Bit
  return par % 2;
}

int calculateEvenParity(char *payload, int size) {
  unsigned char r = 0;
  int i;
  for(i = 0; i < size; i++) {
    r ^= payload[i];
  }
  return calcEvenParityBit(r, CHAR_BIT);
}

反转奇校验的结果。

答案 1 :(得分:0)

Bit Twiddling Hacks

的帮助下
char calcParityBit (unsigned char v)
{
    return (0x6996u >> ((v ^ (v >> 4)) & 0xf)) & 1;
}

这是5次操作而不是7次(在获得@squeamish ossifrage的好建议之后)。

答案 2 :(得分:0)

你必须记住:

1)'x&gt;&gt; a'(int i = 0; i&lt; a; i ++)x / = 2;     因为,如果您使用运算符'&gt;&gt;'对于SIGNED类型,您复制第一位,whitch == 1 in signed types;

2)运营商'&gt;&gt;'和'&lt;&lt;&lt;返回unsigned int值;

(错误示例:unsigned char y =(x&lt;&lt;&lt;&lt;&lt;&lt;&quot;&gt;&gt;&gt; 2; for reset(in 0)两个第一位)

答案 3 :(得分:-1)

你的职能:

char calcParityBit(char x){
    x ^= x >> 8;
    x ^= x >> 4;
    x ^= x >> 2;
    x ^= x >> 1;
    return x & 1;
}

仅为字节的三位计算奇偶校验。要计算整个8位数的奇偶校验,您可以执行以下操作:

char calcParityBit(char x){
    return ( (x>>7) ^ 
             (x>>6) ^
             (x>>5) ^
             (x>>4) ^
             (x>>3) ^
             (x>>2) ^
             (x>>1) ^
             (x) ) & 1;
}

当你坚持使用最低有效位时,如果最有意义的位为'1',你的参数被签名并且右移操作可以用'1'填充移位位这一事实与此解决方案无关(来自你的)

虽然如果标志没有任何实际用途,最好不要使用带号码的号码,并且将号码视为未签名的号码。