-6

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

term.c_lflag &= ~(ICANON);

我知道&=是一个binary AND,我对它不太满意。

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

4

3 回答 3

5

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

这通常被称为“屏蔽”这些位。

该操作是按位与按位求逆(~按位求逆)。

因此,如果在操作之前的值为c_lflag3(二进制 11 2),并且ICANON值为 2(二进制 10 2),它将变为 1,因为它是按位与:与~2除位号之外的所有位都设置的值1(二进制 ...11101 2)。

它也可以写得更详细

term.c_lflag = term.c_lflag & ~ICANON;

ICANON不需要周围的括号。

于 2015-12-02T13:29:18.303 回答
1

您的行删除了ICANONfrom的位term.c_lflag

假设项的长度为 4 位,如果 的值为ICANON4 (0100b),则 的值为~ICANON11 (1011b),因此:

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

==> 1010b,十进制的 10

于 2015-12-02T13:36:26.710 回答
0
term.c_lflag &= ~(ICANON);

等于

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

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

于 2015-12-02T13:36:27.767 回答