我正在维护一个遗留的 C 代码,其中包含对我来说未知的逻辑。很明显跟unsigned char的按位运算有关系。但是我不熟悉按位运算,谁能解释一下这背后的机制?我包括了一些关键陈述。
private const unsigned char DONE_HDR = 0x01;
private const unsigned char DONE_TRL = 0x02;
private const unsigned char DONE_ACC = 0x04;
private const unsigned char DONE_NTW = 0x08;
unsigned char done = 0;
它分配给变量的是什么? 16位数字?
case TAP_HDR:
if (done & DONE_HDR){
//do something
}
done |= DONE_HDR;
break;
case TAP_TRL:
if (done & DONE_TRL){
//do something
}
done |= DONE_TRL;
break;
case TAP_ACC:
if (done & DONE_ACC){
//do something
}
done |= DONE_ACC;
break;
case TAP_NTW:
if (done & DONE_NTW){
//do something
}
done |= DONE_NTW;
break;
如何评估 unsigned char?我以为我们只能评估 bool 值或数字。如果数字是正数,它将被评估为真。但是 unsigned char 没有负值所以我在这里感到困惑。什么时候会是真的? “&”操作的目的/结果是什么?
如果在那之后,无论上面的 if 语句是否为真,它都会:
done |= DONE_HDR;
好像在记录状态。我想无论结果如何,都必须取决于“完成”的值,因为 DONE_HDR 是一个常数。
最后检查:
if (!(done & DONE_HDR))
if (!(done & DONE_TRL))
if (!(done & DONE_ACC))
if (!(done & DONE_NTW))
可以检查是否遇到了所有的记录。再一次,我不知道 & 在这里发挥什么作用。
最佳答案
&
是按位与运算符。所以像这样的表达:(done & MASK)
正在检查是否在
done
中设置了MASK
位。这意味着:!(done & MASK)
正在检查
MASK
是否已清除。赋值运算符行:done |= MASK;
正在
done
中设置MASK
位。char
和signed char
和unsigned char
是整数类型,与任何其他整数类型非常相似 - 它们只是通常较小。它们通常是 8 位类型,但您可以检查stdint.h
中的CHAR_BIT
宏来确定。
关于c - 这段 C 代码对 unsigned char 的操作做了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12292918/