【问题标题】:What does &= mean? [closed]&= 是什么意思? [关闭]
【发布时间】:2014-01-06 19:35:07
【问题描述】:

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

term.c_lflag &= ~(ICANON);

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

【问题讨论】:

  • term.c_lflag = (term.c_lflag) & (~(ICANON))
  • 语义是关闭ICANON标志,离开规范输入模式。 (一旦设置了新的c_lflag 值。)

标签: c termcap


【解决方案1】:

这是在表示位域的整数中将特定位设置为 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

通过按位-oring 一个带有类似于000010000 的掩码的数字来启用位。
通过按位-and使用像111101111 这样的掩码来禁用一个位(因此需要~,它代表按位否定)。

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

  • 在 C++ 中,使用 std::bitset 甚至 std::vector&lt;bool&gt;
  • 在 C 或 C++ 中,使用类似的位域结构

    struct Foo {
       int foo_enabled : 1;
       int bar_enabled : 1;
       // ...
    };
    

【讨论】:

    【解决方案2】:

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

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

    首先,做 term.c_lflag &amp; ~(ICANON) 然后分配给term.c_lflag

    【讨论】:

      【解决方案3】:

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

      关于x &amp;= a,如前所述,可以认为它只是x = x &amp; a 的语法糖。

      【讨论】:

        【解决方案4】:
        term.c_lflag = (term.c_lflag) & (~ICANON)
        

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            猜你喜欢
            • 2010-12-29
            • 2014-09-20
            • 1970-01-01
            • 1970-01-01
            • 2014-04-03
            • 2013-05-16
            • 2011-04-03
            • 2022-01-23
            • 1970-01-01
            相关资源
            最近更新 更多