位运算符

符号 描述 运算规则
& 与 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
*/