1

我正在使用 termcaps,但我不明白&=此示例中的含义:

term.c_lflag &= ~(ICANON);

谁能向我解释这是如何工作的?

4

5 回答 5

8

这是在表示位域的整数中将特定位设置为 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。通过使用掩码对数字进行按位操作来
禁用位(因此需要,它代表按位否定)。and111101111~

请注意,还有其他用于管理位域的选项:

  • 在 C++ 中,使用std::bitset甚至std::vector<bool>
  • 在 C 或 C++ 中,使用类似的位域结构

    struct Foo {
       int foo_enabled : 1;
       int bar_enabled : 1;
       // ...
    };
    
于 2014-01-06T11:17:48.693 回答
4

&=表示Bit Wise AND 然后赋值。例如

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

首先,不要erm.c_lflag & ~(ICANON)然后分配给term.c_lflag

于 2014-01-06T11:05:28.443 回答
2

代码关闭 ICANON 位,正如 Schwartz 在评论中解释的那样:ICANON 通过掩码定义一个位,例如0x8000(ICANON 位是值为 1 的位),当您应用按位运算符时~,所有位都是“反转的" 并且你有(如果值是 16 位宽)0x7FFF。如果你按位( &) 这个值与 x 一起输入,结果是保持 x 的所有与掩码中的“1”位匹配的位不变0x7FFF,并“关闭”与掩码中的“0”位匹配的 x 位掩码,在这种特定情况下正是 ICANON 位。

关于x &= a,正如已经解释过的,它可以被认为只是 . 的语法糖x = x & a

于 2014-01-06T11:17:38.980 回答
1
term.c_lflag = (term.c_lflag) & (~ICANON)
于 2014-01-06T11:05:02.050 回答
1

它与运营商没有太大区别+=。就像它term.c_lflag &= ~(ICANON);应该具有term.c_lflag = term.c_lflag & (~ICANON);但“到位”的效果。您不会创建临时文件,而是会修改term.c_lflag. 请注意这里&是按位与运算符。

于 2014-01-06T11:05:19.493 回答