C中的这个操作是什么?

What is this operation in C?

我开始使用 termcaps,我看到了这种操作。

term.c_lflag &= ~(ICANON);

我知道&=binary AND,我不太适应。

为什么不简单地使用 = 或制作 #define,以及 &= ~ 的作用?

假设 ICANON 是一个位掩码,即一个整数,其位设置为表示某些特征,该语句将确保这些位 而不是 设置在 c_lflag.

这就是常说的"masking off"那些位

运算是按位与与按位取反(~是按位取反)。

所以,如果运算前c_lflag的值为3(二进制112),而ICANON的值为2(二进制10 2),它将变为 1,因为它与值 ~2 进行按位与运算,除位号 1 外,所有位都已设置(二进制 ...111012).

也可以更冗长地写成

term.c_lflag = term.c_lflag & ~ICANON;

ICANON 两边的括号不需要。

你的行从 term.c_lflag 中删除 ICANON 的位:

假设terms是4位长,如果ICANON的值为4(0100b),那么~ICANON的值为11(1011b),所以:

    term.c_lflag  1 1 1 0
AND      ~ICANON  1 0 1 1
    ---------------------
                  1 0 1 0

==> 1010b,十进制为 10

term.c_lflag &= ~(ICANON);

等于

term.c_lflag = term.c_lflag & ~(ICANON);

& 和 ~ 运算符是两个不同的运算符。 ~ 不是运算符,它用它的逆转换每个位。 & 运算符是按位与运算符,它逐位比较操作数。