我开始使用termcaps,我看到了这种操作。
term.c_lflag &= ~(ICANON);
我知道&=
是binary AND
,我对此并不十分熟悉。
为什么不使用=
或制作#define
,以及&= ~
做什么?
答案 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运算符,它逐位比较操作数。