Sve*_*art 0 c++ bit-manipulation bitwise-operators 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_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);
}
}
Run Code Online (Sandbox Code Playgroud)
我知道开关盒是什么,但我不明白这些部件的作用。
m_controlState |= TDC_LEFT
m_controlState &= ~TDC_LEFT
Run Code Online (Sandbox Code Playgroud)
m_controlState是一个整数。该GFLW_KEY“S还指一个int值。
有人可以解释这些部分的作用吗?带有输入值和结果的示例会很好。
不等于链接的问题,因为我也询问 &=
&= |= 运算符在某种意义上类似于+=/-=(即a &= b 等价于a = a & b)。但是,他们进行二元运算。& 是按位运算,而 | 正在按位或操作。
例子:
一 = 1101
b = 1011
a & b = 1001
| 乙 = 1111
我还认为应该解释这些运算符的作用和使用方式。
m_controlState 用作标志,这意味着它以二进制形式包含按下了哪些键。例如,如果 tds 常量的值选择如下:
TDS_LEFT = 0x00001
TDS_RIGH = 0x01 << 2 = 0x00010
TDS_UP = 0x01 << 3 = 0x00100
TDS_DOWN = 0x01 << 4 = 0x01000
Run Code Online (Sandbox Code Playgroud)
然后,您可以在单个整数中存储设置了哪些选项的信息。为此,您只需检查每个设置对应的位是 1 还是 0。
因此,要设置 TDS_LEFT 选项,您必须将当前状态与 0x00001(即 TDS_LEFT)进行或操作,因此在代码中
m_controlState = m_controlState | TDS_LEFT
Run Code Online (Sandbox Code Playgroud)
这与以下相同
m_controlState |= TDS_LEFT.
Run Code Online (Sandbox Code Playgroud)
要取消设置 TDS_LEFT 选项,您必须将其与 ~TDS_LEFT 进行 AND 操作。所以
m_controlState = m_controlState & ~TDS_LEFT
Run Code Online (Sandbox Code Playgroud)
与以下内容相同:
m_controlState &= ~TDS_LEFT
Run Code Online (Sandbox Code Playgroud)
您还可以检查:How to use enums as flags in C++? 。希望这能让它更清楚。
| 归档时间: |
|
| 查看次数: |
8601 次 |
| 最近记录: |