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);
& 和 ~ 运算符是两个不同的运算符。 ~ 不是运算符,它用它的逆转换每个位。 & 运算符是按位与运算符,它逐位比较操作数。
我开始使用 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);
& 和 ~ 运算符是两个不同的运算符。 ~ 不是运算符,它用它的逆转换每个位。 & 运算符是按位与运算符,它逐位比较操作数。