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
是一个整数。 GFLW_KEY
也引用了一个 int 值。
谁能解释一下这些部分的作用?带有输入值和结果的示例会很好。
不等于链接问题因为我也问了&=
x |= y
等同于 x = x|y
一般来说,对于任何二元运算符 *
,a *= b
等价于 a = a*b
如果您想知道 &
和 |
是什么,请阅读 bitwise operators。
这些是按位与和或运算。你提到的行相当于:
m_controlState = m_controlState | TDC_LEFT;
m_controlState = m_controlState & ~TDC_LEFT
&= |= 运算符在某种意义上类似于 +=/-=(即 a &= b 等同于 a = a & b)。但是,他们进行二进制操作。 & 是按位和操作,而 |正在做按位或运算。
示例:
一=1101
b = 1011
a & b = 1001
一个 | b = 1111
x |= y
专门打开(设置为 1)x
中出现在 y
中的那些位,让 x
中的所有其他位保持原样。
x &= ~y
专门关闭(设置为 0)x
中出现在 y
中的那些位,让 x
中的所有其他位保持原样。
这是设置和重置字中特定位的简单方法。
bitword |= MASK 是 shorthand of bitword = bitword |设置屏蔽位的 MASK
bitword &= ~MASK 清除该位(检查您的布尔代数笔记本以了解原因)
这两个:
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) |
是 按位或 ,相当于 add 到该位集。
所以如果 TDC_LEFT 是 00000010:
01010000 | 00000010 = 01010010
2) ~
按位取反:
~00000010 = 111111101
如果你这样做
01010010 & ~(00000010) = 01010000
,实际上等同于位集差.
简而言之:
bitsetA + bitsetB <=> bitsetA | bitset
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
然后在单个整数中,您可以存储设置了哪些选项的信息。为此,您只需检查每个设置对应的位是 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
您还可以查看:How to use enums as flags in 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 值。
谁能解释一下这些部分的作用?带有输入值和结果的示例会很好。
不等于链接问题因为我也问了&=
x |= y
等同于 x = x|y
一般来说,对于任何二元运算符 *
,a *= b
等价于 a = a*b
如果您想知道 &
和 |
是什么,请阅读 bitwise operators。
这些是按位与和或运算。你提到的行相当于:
m_controlState = m_controlState | TDC_LEFT;
m_controlState = m_controlState & ~TDC_LEFT
&= |= 运算符在某种意义上类似于 +=/-=(即 a &= b 等同于 a = a & b)。但是,他们进行二进制操作。 & 是按位和操作,而 |正在做按位或运算。
示例:
一=1101
b = 1011
a & b = 1001
一个 | b = 1111
x |= y
专门打开(设置为 1)x
中出现在 y
中的那些位,让 x
中的所有其他位保持原样。
x &= ~y
专门关闭(设置为 0)x
中出现在 y
中的那些位,让 x
中的所有其他位保持原样。
这是设置和重置字中特定位的简单方法。
bitword |= MASK 是 shorthand of bitword = bitword |设置屏蔽位的 MASK
bitword &= ~MASK 清除该位(检查您的布尔代数笔记本以了解原因)
这两个:
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) |
是 按位或 ,相当于 add 到该位集。
所以如果 TDC_LEFT 是 00000010:
01010000 | 00000010 = 01010010
2) ~
按位取反:
~00000010 = 111111101
如果你这样做
01010010 & ~(00000010) = 01010000
,实际上等同于位集差.
简而言之:
bitsetA + bitsetB <=> bitsetA | bitset
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
然后在单个整数中,您可以存储设置了哪些选项的信息。为此,您只需检查每个设置对应的位是 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
您还可以查看:How to use enums as flags in C++?。 希望这能让它更清楚。