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

从c中的字符串计算奇偶校验位,c,bitwise-operators,parity,C,Bitwise Operators,Parity,我试图使用以下代码计算字符串中的奇偶校验位,我首先计算字符串的一个parityByte,然后计算 根据我收集的这些函数,该字节有一个parityBit 我应该这样做,但我现在不太确定,我使用它们的程序失败了,我现在想知道是不是因为这些,还是我应该去其他地方看看 char calculateParity(char *payload, int size){ char r = 0; int i; for(i = 0; i < size; i++){ r ^

我试图使用以下代码计算字符串中的奇偶校验位,我首先计算字符串的一个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;
}
char计算能力(char*payload,int size){
字符r=0;
int i;
对于(i=0;i>8;
x^=x>>4;
x^=x>>2;
x^=x>>1;
返回x&1;
}
作为注释:使用
无符号字符进行计算。由于
char
可能有符号,右移位可能会复制符号位

此外,代码的返回值通常为
int
而不是
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);
}
//查找奇偶校验(任意宽度,不超过无符号字符串的宽度)
int CalcNavePalyTITLE(未签名PAR,无符号宽度){
而(宽度>1){
PAL^=PAR>(宽度/ 2);
宽度-=宽度/2;
}
//仅返回最低有效位
回报率2;
}
int CalculateEventParity(字符*有效负载,int大小){
无符号字符r=0;
int i;
对于(i=0;i
反转奇数奇偶校验的结果。

您的函数:

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”填充移位位,这一事实与此解决方案无关(此解决方案源自您的解决方案)

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

这是5次手术与7次手术(在听取了医生的建议后)。

你必须记住:

1) 对于(inti=0;i>”,则会复制有符号类型中的第一位,which==1


2) 运算符“>>”和“使用
无符号字符
,而不是
字符
”。如果右移(有符号)
char
,则保留符号位。这破坏了你的平价计算。此外,行
x^=x>>8是不必要的
x
只有8位。您能给出一个失败的输入示例吗?我看这里没有什么真正的错误(无用的
x^=x>>8
步骤没有任何作用,即使
char
是有符号的,负-翻转所有位不会改变奇偶校验)看起来有一个
 <代码> {<代码> >结束>代码> int CalCODDPARYITY BIT(未签名PAR,无符号宽度)计算`
EvenParityBit
。对于
odd
奇偶校验,如果
par
中有
偶数的
1
,则
OddParityBit=1
否则
OddParityBit=0
。对于
10(1010)
11(1011),尝试
Calcode>
。对于
10
它返回
0
,对于
11
它返回
1
偶数
奇偶校验位)
:p
。现在您必须将
v
更改为
x
:p
而且,它只计算
偶数
奇偶校验位。(例如,
1的奇数
奇偶校验位是
1
奇偶校验位)奇数
奇偶校验位的情况正好相反。为什么是负数?
char calcParityBit (unsigned char v)
{
    return (0x6996u >> ((v ^ (v >> 4)) & 0xf)) & 1;
}