繁体   English   中英

C ++的含义| =和&=

[英]C++ meaning |= and &=

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

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

有人可以解释一下这些部分用输入值做一个例子,结果会很好。

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

例:

a = 1101

b = 1011

a&b = 1001

一个| b = 1111

另外,我认为应该解释这些运算符的作用和用法。

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

您还可以检查: 如何在C ++中将枚举用作标志? 希望事情变得更清楚。

x |= y等效于x = x|y

通常,对于任何二进制运算符*a *= b等效于a = a*b

如果您想知道&| 是,了解按位运算符

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

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

这两个:

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 & ~(00000010) = 01010000 ,则实际上等效于bitset差异

简而言之:

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

x |= y具体地接通(设置为1)的那些位x存在于y ,留下所有其它在x原样。

x &= ~y具体关闭(设置为0)中的那些位x存在于y ,留下所有其它在x原样。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM