&=是什么意思?

我正在使用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语法糖。