从c中的字符串计算奇偶校验位
我试图使用以下代码计算字符串中的奇偶校验位,我首先计算字符串的一个parityByte,然后计算 根据我收集的这些函数,该字节有一个parityBit 我应该这样做,但我现在不太确定,我使用它们的程序失败了,我现在想知道是不是因为这些,还是我应该去其他地方看看从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 ^
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;
}