C中的这个操作是什么?

时间:2015-12-02 13:26:16

标签: c binary termcap

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

term.c_lflag &= ~(ICANON);

我知道&=binary AND,我对此并不十分熟悉。

为什么不使用=或制作#define,以及&= ~做什么?

3 个答案:

答案 0 :(得分:5)

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

这通常被称为"掩盖"那些位。

该操作是按位反转的AND(~按位反转)。

因此,如果操作前c_lflag的值为3(二进制11 2 ),ICANON的值为2(二进制10 2 < / sub>),它将变为1,因为它是按位-AND:ed,其值为~2,其中所有位都设置为除了位号1(二进制... 11101 2 )。

它也可以更详细地写成

term.c_lflag = term.c_lflag & ~ICANON;

不应该需要ICANON周围的括号。

答案 1 :(得分:1)

您的行会从ICANON删除term.c_lflag的位:

假设术语长度为4位,如果ICANON的值为4(0100b),则~ICANON的值为11(1011b),因此:

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

==&GT; 1010b,十进制10

答案 2 :(得分:0)

term.c_lflag &= ~(ICANON);

等于

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

&安培;和〜运算符是两个不同的运算符。 〜是NOT运算符,用它的反转换每个位。 &安培; operator是按位AND运算符,它逐位比较操作数。