位运算符
| 符号 | 描述 | 运算规则 |
|---|---|---|
| & | 与 AND | 两个操作数都为 1 时,运算结果为 1 |
| | | 或 OR | 两个操作数都为 0 时, 运算结果为 0 |
| ^ | 异或 XOR | 两个操作数相同时运算结果为 0, 两个操作数不同结果为 1 |
| ~ | 取反 NOT | 如果操作数为 0 运算结果为 1, 如果操作数是 1 运算结果为 0 |
示例:
| A | B | A&B | A|B | A^B | ~A |
|---|---|---|---|---|---|
| 0 | 0 | 0 | 0 | 0 | 1 |
| 1 | 0 | 0 | 1 | 1 | 0 |
| 0 | 1 | 0 | 1 | 1 | 1 |
| 1 | 1 | 1 | 1 | 0 | 0 |
位运算的运用
一个值表示多个状态(打标记):
#include <iostream>
using namespace std;
const int FROZEN = 0b0001; // 冰冻状态
const int FIRE = 0b0001 << 1; // 着火状态
const int STUCK = 0b0001 << 2; // 行动受限制
void add_status(int &player_status, int new_status)
{
// player_status = player_status | new_status;
player_status |= new_status;
}
void delete_status(int &player_status, int new_status)
{
// player_status = player_status & (~new_status);
player_status &= ~new_status;
}
bool has_status(int &player_status, int status)
{
return (player_status & status) == status;
}
int main(int argc, char const *argv[])
{
int status = 0; // 玩家状态
bool is_frozen = false; // 是否被冰冻
bool is_fire = false; // 是否着火
bool is_stuck = false; // 是否行动受限
cout << "玩家状态: " << status << endl;
cout << "是否被冰冻: " << is_frozen << endl;
cout << "是否着火: " << is_fire << endl;
cout << "是否行动受限: " << is_stuck << endl;
add_status(status, FROZEN);
add_status(status, FIRE);
add_status(status, STUCK);
delete_status(status, FIRE);
is_frozen = has_status(status, FROZEN);
is_fire = has_status(status, FIRE);
is_stuck = has_status(status, STUCK);
cout << "玩家状态: " << status << endl;
cout << "是否被冰冻: " << is_frozen << endl;
cout << "是否着火: " << is_fire << endl;
cout << "是否行动受限: " << is_stuck << endl;
return 0;
}
/*
玩家状态: 0
是否被冰冻: 0
是否着火: 0
是否行动受限: 0
玩家状态: 5
是否被冰冻: 1
是否着火: 0
是否行动受限: 1
*/