我正在使用 termcaps,但我不明白&=
此示例中的含义:
term.c_lflag &= ~(ICANON);
谁能向我解释这是如何工作的?
这是在表示位域的整数中将特定位设置为 0 的常用方法。
unsigned a = ...;
// ...
unsigned int mask = 1 << 11; // mask for 12th bit
a |= mask; // set 12th bit to 1
a &= ~mask; // set 12th bit to 0
启用位可以通过or
使用看起来像 的掩码对数字按位进行000010000
。通过使用掩码对数字进行按位操作来
禁用位(因此需要,它代表按位否定)。and
111101111
~
请注意,还有其他用于管理位域的选项:
std::bitset
甚至std::vector<bool>
在 C 或 C++ 中,使用类似的位域结构
struct Foo {
int foo_enabled : 1;
int bar_enabled : 1;
// ...
};
&=
表示Bit Wise AND
然后赋值。例如
term.c_lflag = (term.c_lflag) & (~(ICANON))
首先,不要erm.c_lflag & ~(ICANON)
然后分配给term.c_lflag
代码关闭 ICANON 位,正如 Schwartz 在评论中解释的那样:ICANON 通过掩码定义一个位,例如0x8000
(ICANON 位是值为 1 的位),当您应用按位非运算符时~
,所有位都是“反转的" 并且你有(如果值是 16 位宽)0x7FFF
。如果你按位和( &
) 这个值与 x 一起输入,结果是保持 x 的所有与掩码中的“1”位匹配的位不变0x7FFF
,并“关闭”与掩码中的“0”位匹配的 x 位掩码,在这种特定情况下正是 ICANON 位。
关于x &= a
,正如已经解释过的,它可以被认为只是 . 的语法糖x = x & a
。
term.c_lflag = (term.c_lflag) & (~ICANON)
它与运营商没有太大区别+=
。就像它term.c_lflag &= ~(ICANON);
应该具有term.c_lflag = term.c_lflag & (~ICANON);
但“到位”的效果。您不会创建临时文件,而是会修改term.c_lflag
. 请注意这里&
是按位与运算符。