&=是什么意思?
我正在使用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
(因此需要~
,代表按位否定)。
请注意,还有其他用于管理位域的选项:
- 在C ++中,使用
std::bitset
甚至std::vector
-
在C或C ++中,使用类似于bitfield的结构
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
term.c_lflag = (term.c_lflag) & (~ICANON)
它与运算符+=
没有太大区别。 就像term.c_lflag &= ~(ICANON);
应该具有term.c_lflag = term.c_lflag & (~ICANON);
但“到位”。 您不会创建临时的,而是修改term.c_lflag
。 请注意这里&
是按位AND运算符。
代码关闭ICANON位,正如Schwartz在评论中解释的那样:ICANON通过掩码定义一个位,例如0x8000
(ICANON位是值为1的那个),当你应用bitwise not运算符时, ~
,所有位都是“倒”,你有(如果值是16位宽) 0x7FFF
。 如果你用x输入bitwise 和 ( &
)这个值,结果是保持x的所有位都不变,匹配掩码0x7FFF
的“1”位,并“关闭”匹配“0”位的x位在掩码中,这正是这种特定情况下的ICANON位。
关于x &= a
,如已经解释的那样,它可以被认为是x = x & a
语法糖。