我正在维护一个包含未知逻辑的遗留 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?我以为我们只能评估布尔值或数字。如果数字为正,则将其评估为真。但是 unsigned char 没有负值,所以我在这里感到困惑。什么时候会是真的?“&”操作的目的/结果是什么?
如果在那之后,无论上面的 if 语句是否为真,它都会:
done |= DONE_HDR;
似乎正在记录状态。我想它产生的任何东西都必须取决于“完成”的值,因为 DONE_HDR 是一个常数。
最后检查:
if (!(done & DONE_HDR))
if (!(done & DONE_TRL))
if (!(done & DONE_ACC))
if (!(done & DONE_NTW))
可能正在检查它是否遇到了所有记录。再一次,我不知道 & 在这里是如何发挥作用的。