=和&=

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

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是一个int。 GFLW_KEY也引用一个int值。

有人可以解释一下这些部分是如何用输入值和结果做一个例子的。


此外,我认为应该解释这些操作员所做的和以这种方式使用的。

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)或当前状态,所以在代码中

m_controlState = m_controlState | TDS_LEFT

这是一样的

m_controlState |= TDS_LEFT.

要取消设置TDS_LEFT选项,您必须将其与〜TDS_LEFT进行比较。 所以

m_controlState = m_controlState & ~TDS_LEFT

这与以下内容相同:

m_controlState &= ~TDS_LEFT

你也可以检查:如何在枚举中使用枚举作为标志? 希望更清楚。


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

例:

a = 1101

b = 1011

a&b = 1001

a | b = 1111


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

m_controlState = m_controlState | TDC_LEFT;
m_controlState = m_controlState & ~TDC_LEFT
链接地址: http://www.djcxy.com/p/72649.html

上一篇: = and &=

下一篇: How does Bitwise AND interact with boolean values?