c - 这段 C 代码对 unsigned char 的操作做了什么?

标签 c bit-manipulation

我正在维护一个遗留的 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))

可以检查是否遇到了所有的记录。再一次,我不知道 & 在这里发挥什么作用。

最佳答案

  1. & 是按位与运算符。所以像这样的表达:

    (done & MASK)
    

    正在检查是否在 done 中设置了 MASK 位。这意味着:

    !(done & MASK)
    

    正在检查 MASK 是否已清除。赋值运算符行:

    done |= MASK;
    

    正在done中设置MASK位。

  2. charsigned charunsigned char 是整数类型,与任何其他整数类型非常相似 - 它们只是通常较小。它们通常是 8 位类型,但您可以检查 stdint.h 中的 CHAR_BIT 宏来确定。

关于c - 这段 C 代码对 unsigned char 的操作做了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12292918/

相关文章:

c - 在c中声明十六进制字符 'error: multi-character character constant'

c - 动态内存分配(C 编程)

C语言类型转换

c - 确定字节中的哪一位被设置

c - 取 C 中半字节的最后 2 位

c - 当仍有大量交换空间时,malloc 失败

c - '->' 的无效类型参数(有 'int' )

java - Java算子的疑惑

math - 按位 XOR(异或)是什么意思?

c# - 小于 0-255 时按位二进制溢出,例如0-32?