C++ C++;含义|=和&=

C++ C++;含义|=和&=,c++,box2d,C++,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_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是一个int。GFLW_键也指一个int值


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

x |=y
相当于
x=x | y

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


如果你想知道什么是
&
|
,请阅读。

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 = m_controlState | TDC_LEFT
m_controlState = m_controlState & ~TDC_LEFT

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

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

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

例如:

a=1101

b=1011

a&b=1001


a | b=1111

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

例如:

a=1101

b=1011

a&b=1001


a | b=1111

x |=y
专门打开(设置为1)出现在
y
中的
x
中的那些位,使
x
中的所有其他位保持原样


x&=~y
专门关闭(设置为0)出现在
y
中的
x
中的那些位,使
x
中的所有其他位保持原样。

x |=y
专门打开(设置为1)出现在
y
中的
x
中的那些位,使
x
中的所有其他位保持原样


x&=~y
专门关闭(设置为0)出现在
y
中的
x
中的那些位,使
x
中的所有其他位保持原样。

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

位字|=掩码是位字=位字|掩码的缩写,用于设置掩码位


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

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

位字|=掩码是位字=位字|掩码的缩写,用于设置掩码位

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

这两个:

m_controlState |= TDC_LEFT
m_controlState &= ~TDC_LEFT
相当于:

m_controlState = m_controlState | TDC_LEFT;
m_controlState = 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
,它实际上相当于位集差

简言之:
bitsetA+bitsetB bitsetA |位集
bitsetA-bitsetB bitsetA&~bitset
这两个:

m_controlState |= TDC_LEFT
m_controlState &= ~TDC_LEFT
相当于:

m_controlState = m_controlState | TDC_LEFT;
m_controlState = 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
,它实际上相当于位集差

简言之:
bitsetA+bitsetB bitsetA |位集
bitsetA-bitsetB bitsetA&~bitset

此外,我认为应该解释一下这些操作符的作用和使用方式

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

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

m_controlState |= TDS_LEFT.
要取消设置TDS_LEFT选项,您必须使用~TDS_LEFT进行设置。所以

m_controlState = m_controlState & ~TDS_LEFT
这与:

m_controlState &= ~TDS_LEFT
您还可以检查:。
希望这能让事情变得更清楚。

我还认为应该解释一下这些操作符的作用和使用方式

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

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

m_controlState |= TDS_LEFT.
要取消设置TDS_LEFT选项,您必须使用~TDS_LEFT进行设置。所以

m_controlState = m_controlState & ~TDS_LEFT
这与:

m_controlState &= ~TDS_LEFT
您还可以检查:。
希望它能更清楚。

见:“孪生兄弟只给它一个名字,而不是一个解释。可能的复制品在这里看到:”孪生兄弟只给它一个名字,而不是一个解释。可能的重复添加一个小的关于什么和什么是和(或C++符号),可能改变,或“和”和“to <代码>或< /代码>和<代码>和< /代码>。这是最简单的答案。在一个小的地方添加关于“什么”和“和”(C++符号),以及可能改变“或者”和“和”到<代码>或和。这无疑是最好的答案。