C 含义 \|= 和 &=

新手上路,请多包涵

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

 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 值。

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

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

原文由 Sven van den Boogaart 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 867
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++? .希望这能让它更清楚。

原文由 GeneralFailure 发布,翻译遵循 CC BY-SA 3.0 许可协议

&= / |= operators in a sense are similar to += / -= (ie a &= b is equivalent to a = a & b )。但是,他们进行二进制操作。 & 是按位和运算,而 | 是按位或运算。

例子:

一个 = 1101

b = 1011

a & b = 1001

一个 |乙 = 1111

原文由 Algirdas Preidžius 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题