MST

星途 面试题库

面试题:C++ 位运算之状态标志管理

假设你正在开发一个游戏角色系统,角色有多种状态,比如是否处于隐身(invisible)、是否在奔跑(running)、是否持有武器(hasWeapon)。请使用C++ 的位运算来设计一个数据结构来高效管理这些状态,实现设置状态、清除状态以及检查某个状态是否存在的函数。
15.0万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
#include <iostream>

// 定义状态标志位
enum class CharacterState : unsigned char {
    Invisible = 1 << 0,
    Running = 1 << 1,
    HasWeapon = 1 << 2
};

class Character {
private:
    unsigned char stateFlags;

public:
    Character() : stateFlags(0) {}

    // 设置状态
    void setState(CharacterState state) {
        stateFlags |= static_cast<unsigned char>(state);
    }

    // 清除状态
    void clearState(CharacterState state) {
        stateFlags &= ~static_cast<unsigned char>(state);
    }

    // 检查状态是否存在
    bool checkState(CharacterState state) const {
        return (stateFlags & static_cast<unsigned char>(state)) != 0;
    }
};

你可以使用以下方式调用这些函数:

int main() {
    Character character;

    // 设置状态
    character.setState(CharacterState::Invisible);
    character.setState(CharacterState::Running);

    // 检查状态
    std::cout << "Is invisible: " << (character.checkState(CharacterState::Invisible)? "Yes" : "No") << std::endl;
    std::cout << "Is running: " << (character.checkState(CharacterState::Running)? "Yes" : "No") << std::endl;
    std::cout << "Has weapon: " << (character.checkState(CharacterState::HasWeapon)? "Yes" : "No") << std::endl;

    // 清除状态
    character.clearState(CharacterState::Running);

    // 再次检查状态
    std::cout << "Is running: " << (character.checkState(CharacterState::Running)? "Yes" : "No") << std::endl;

    return 0;
}
  1. 状态标志位定义:使用enum class定义不同的状态标志位,每个标志位对应一个唯一的位。
  2. Character
    • 包含一个unsigned char类型的成员变量stateFlags,用于存储角色的状态。
    • setState函数使用按位或(|)操作设置特定状态。
    • clearState函数使用按位与(&)和按位取反(~)操作清除特定状态。
    • checkState函数使用按位与(&)操作检查特定状态是否存在。

main函数中展示了如何使用这些函数来管理角色的状态。