【问题标题】:C++ meaning |= and &= [duplicate]C++ 含义 |= 和 &= [重复]
【发布时间】:2016-01-23 02:41:24
【问题描述】:

我有一段代码包含以下函数:

void Keyboard(int key)
{
    switch (key) {
    case GLFW_KEY_A: m_controlState |= TDC_LEFT; break;
    case GLFW_KEY_D: m_controlState |= TDC_RIGHT; break;
    case GLFW_KEY_W: m_controlState |= TDC_UP; break;
    case GLFW_KEY_S: m_controlState |= TDC_DOWN; break;
    default: Test::Keyboard(key);
    }
}

void KeyboardUp( int key)
{
    switch (key) {
    case GLFW_KEY_A: m_controlState &= ~TDC_LEFT; break;
    case GLFW_KEY_D: m_controlState &= ~TDC_RIGHT; break;
    case GLFW_KEY_W: m_controlState &= ~TDC_UP; break;
    case GLFW_KEY_S: m_controlState &= ~TDC_DOWN; break;
    default: Test::Keyboard(key);
    }
}

我知道开关盒是什么,但我不明白这些部分的作用。

m_controlState |= TDC_LEFT
m_controlState &= ~TDC_LEFT

m_controlState 是一个整数。 GFLW_KEY 也指一个 int 值。

有人能解释一下这些部分的作用吗?一个带有输入值和结果的例子会很好。

不等于链接的问题,因为我也问过 &=

【问题讨论】:

标签: c++ bit-manipulation box2d bitwise-operators


【解决方案1】:

&= |= 运算符在某种意义上类似于 +=/-=(即 a &= b 等价于 a = a & b)。但是,他们进行二进制操作。 & 进行按位与运算,而 |正在做按位或运算。

例子:

a = 1101

b = 1011

a & b = 1001

一个 | b = 1111

【讨论】:

    【解决方案2】:

    另外我认为应该解释一下这些运算符的作用和使用方式。

    m_controlState 用作标志,这意味着它以二进制形式包含按下了哪些键。 例如,如果 tds 常量的值是这样选择的:

    TDS_LEFT             = 0x00001
    TDS_RIGH = 0x01 << 2 = 0x00010 
    TDS_UP   = 0x01 << 3 = 0x00100
    TDS_DOWN = 0x01 << 4 = 0x01000
    

    然后,您可以在单个整数中存储设置了哪些选项的信息。为此,您只需检查每个设置对应的位是 1 还是 0。

    所以要设置 TDS_LEFT 选项,您必须将当前状态与 0x00001(即 TDS_LEFT)进行 OR,所以在代码中

    m_controlState = m_controlState | TDS_LEFT
    

    相同
    m_controlState |= TDS_LEFT.
    

    要取消设置 TDS_LEFT 选项,您必须将其与 ~TDS_LEFT 相加。所以

    m_controlState = m_controlState & ~TDS_LEFT
    

    等同于:

    m_controlState &= ~TDS_LEFT
    

    您也可以查看:How to use enums as flags in C++?。 希望这能让它更清楚。

    【讨论】:

    • 添加一点关于什么是 AND 和 OR(C++ 符号),并可能将“或”和“与”更改为 orand。这很容易成为最佳答案。
    【解决方案3】:

    这些是按位 AND 和 OR 运算。您提到的行相当于:

    m_controlState = m_controlState | TDC_LEFT;
    m_controlState = m_controlState & ~TDC_LEFT
    

    【讨论】:

      【解决方案4】:

      x |= y 等价于x = x|y

      一般来说,对于任何二元运算符*a *= b 等价于a = a*b

      如果您想知道&amp;| 是什么,请阅读bitwise operators

      【讨论】:

        【解决方案5】:

        这两个:

        m_controlState |= TDC_LEFT
        m_controlState &= ~TDC_LEFT
        

        等价于:

        m_controlState = m_controlState | TDC_LEFT
        m_controlState = m_controlState & ~TDC_LEFT
        

        它适用于所有内置 X= 运算符。

        m_controlState 很可能被视为一个位集。 m_controlState 可能是,例如01010000(实际上会大于 8 位)。

        1) |按位或,相当于添加到该位集。

        所以如果 TDC_LEFT 是 00000010:

        01010000 | 00000010 = 01010010
        

        2) ~ 按位否定

        ~00000010 = 111111101
        

        如果你这样做了 01010010 &amp; ~(00000010) = 01010000,实际上相当于 bitset 差异

        简而言之:

        bitsetA + bitsetB <=> bitsetA | bitset
        bitsetA - bitsetB <=> bitsetA & ~ bitset
        

        【讨论】:

          【解决方案6】:

          x |= y 专门打开(设置为 1)x 中存在于 y 中的那些位,而将所有其他位留在 x 中。

          x &amp;= ~y 专门关闭(设置为 0)x 中存在于y 中的那些位,而将所有其他位留在x 中。

          【讨论】:

            【解决方案7】:

            这是一种设置和重置单词中特定位的简单方法。

            bitword |= MASK 是 bitword = bitword | 的简写。 MASK 设置掩码位

            bitword &= ~MASK 清除该位(查看布尔代数笔记本了解原因)

            【讨论】:

              猜你喜欢
              • 2014-04-15
              • 1970-01-01
              • 2022-08-03
              • 1970-01-01
              • 2021-03-29
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2014-09-14
              相关资源
              最近更新 更多