C++ 含义 |= 和 &=

Sve*_*art 0 c++ bit-manipulation bitwise-operators box2d

我有一部分代码包含以下功能:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

m_controlState |= TDC_LEFT
m_controlState &= ~TDC_LEFT
Run Code Online (Sandbox Code Playgroud)

m_controlState是一个整数。该GFLW_KEY“S还指一个int值。

有人可以解释这些部分的作用吗?带有输入值和结果的示例会很好。

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

Alg*_*ius 5

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

例子:

一 = 1101

b = 1011

a & b = 1001

| 乙 = 1111


Gen*_*ure 5

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

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

TDS_LEFT             = 0x00001
TDS_RIGH = 0x01 << 2 = 0x00010 
TDS_UP   = 0x01 << 3 = 0x00100
TDS_DOWN = 0x01 << 4 = 0x01000
Run Code Online (Sandbox Code Playgroud)

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

因此,要设置 TDS_LEFT 选项,您必须将当前状态与 0x00001(即 TDS_LEFT)进行或操作,因此在代码中

m_controlState = m_controlState | TDS_LEFT
Run Code Online (Sandbox Code Playgroud)

这与以下相同

m_controlState |= TDS_LEFT.
Run Code Online (Sandbox Code Playgroud)

要取消设置 TDS_LEFT 选项,您必须将其与 ~TDS_LEFT 进行 AND 操作。所以

m_controlState = m_controlState & ~TDS_LEFT
Run Code Online (Sandbox Code Playgroud)

与以下内容相同:

m_controlState &= ~TDS_LEFT
Run Code Online (Sandbox Code Playgroud)

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