0

我正在尝试使用以下代码计算字符串中的奇偶校验位,我首先为字符串计算一个 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

4 回答 4

0

正如@squeamish ossifrage 评论:unsigned char用于计算。char可以有符号,右移可以复制符号位。

此外,代码通常在返回值为intvs时运行得最好char。推荐使用返回值,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);
}

反转奇校验的结果。

于 2015-04-01T00:22:33.440 回答
0

你必须记住:

1) 'x >> a' for(int i = 0; i < a; i++) x/=2; 因为,如果您对 SIGNED 类型使用运算符 '>>',则会在有符号类型中复制第一位 whitch == 1;

2) 运算符 '>>' 和 '<<' 返回 unsigned int 值;

(错误示例:unsigned char y = (x << 2) >> 2; 用于重置(0 中)两个第一位)

于 2015-04-10T18:08:53.327 回答
0

Bit Twiddling Hacks的帮助下

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

这是 5 次操作对 7 次(在接受了@squeamish ossifrage的好建议之后)。

于 2015-04-01T01:51:25.243 回答
-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”填充移位的位这一事实与此解决方案无关(源自你的)

尽管如果符号没有任何实际用途,最好不要将数字与符号一起使用,并且您将数字视为未签名的数字。

于 2015-04-01T00:36:41.673 回答