std::bitset通过紧凑存储和类型安全的位操作,在内存效率和代码可读性上优于bool数组和整数位运算,适用于固定数量的标志管理,如状态控制和权限处理,其性能优越且支持逻辑运算与字符串转换,但大小需在编译时确定,不适用于动态扩展场景。

C++ 中的
std::bitset
在我看来,
std::bitset
bitset
std::bitset<32> flags;
操作这些位也非常方便。如果你想把某个位置的位设为1,用
flags.set(index)
flags.reset(index)
flags.flip(index)
flags.test(index)
bool
当然,
bitset
&
|
^
~
flags |= new_permission;
count()
any()
none()
all()
立即学习“C++免费学习笔记(深入)”;
一个我特别欣赏的特性是,
bitset
std::bitset<8> b("10101100");bitset
谈到
bitset
bool
bool
bitset
bitset<32>
bool[32]
再者,相比直接使用整数进行位运算,
bitset
int
unsigned int
status | (1 << FLAG_BIT)
status & (1 << 19)
status & (1 << 20)
bitset
set()
test()
reset()
bitset
#include <iostream>
#include <bitset>
#include <vector>
int main() {
// 内存效率对比
std::bitset<256> flags_bitset; // 理论上 256/8 = 32 字节
std::vector<bool> flags_vec_bool(256); // std::vector<bool> 是特化版本,也是位打包的,但行为上更像动态数组
bool flags_bool_array[256]; // 256 字节
std::cout << "bitset<256> 理论占用: " << sizeof(flags_bitset) << " 字节" << std::endl;
// 注意:std::vector<bool> 的 sizeof 通常是其内部指针和大小,不是实际存储空间
std::cout << "bool[256] 占用: " << sizeof(flags_bool_array) << " 字节" << std::endl;
// 语义清晰度对比
enum Permission {
READ = 0,
WRITE = 1,
EXECUTE = 2,
DELETE = 3
};
std::bitset<4> user_permissions;
user_permissions.set(READ);
user_permissions.set(WRITE);
if (user_permissions.test(READ)) {
std::cout << "用户有读权限." << std::endl;
}
// 传统整数位运算
unsigned int raw_permissions = 0;
raw_permissions |= (1 << READ);
raw_permissions |= (1 << WRITE);
if ((raw_permissions & (1 << READ)) != 0) {
std::cout << "用户有读权限 (传统方式)." << std::endl;
}
return 0;
}这段代码跑起来,你会发现
bitset
sizeof
std::vector<bool>
bitset
bitset
在实际项目中,
bitset
举个例子,假设你正在开发一个游戏,每个游戏对象可能有很多状态:是否可见、是否活跃、是否可被攻击、是否处于眩晕状态等等。如果用一堆
bool
bitset
bitset
#include <iostream>
#include <bitset>
// 定义游戏对象可能的状态位
enum GameObjectState {
STATE_VISIBLE = 0,
STATE_ACTIVE = 1,
STATE_ATTACKABLE = 2,
STATE_STUNNED = 3,
STATE_INVULNERABLE = 4,
NUM_GAME_OBJECT_STATES // 用于bitset大小
};
class GameObject {
public:
std::bitset<NUM_GAME_OBJECT_STATES> states;
void activate() { states.set(STATE_ACTIVE); }
void deactivate() { states.reset(STATE_ACTIVE); }
bool isActive() const { return states.test(STATE_ACTIVE); }
void stun() { states.set(STATE_STUNNED); }
void removeStun() { states.reset(STATE_STUNNED); }
bool isStunned() const { return states.test(STATE_STUNNED); }
void setVisible(bool visible) {
if (visible) states.set(STATE_VISIBLE);
else states.reset(STATE_VISIBLE);
}
bool isVisible() const { return states.test(STATE_VISIBLE); }
// 组合检查
bool canBeAttacked() const {
return states.test(STATE_ATTACKABLE) && !states.test(STATE_STUNNED) && !states.test(STATE_INVULNERABLE);
}
// 打印所有状态
void printStates() const {
std::cout << "当前状态: " << states << std::endl;
if (states.test(STATE_ACTIVE)) std::cout << " - 活跃" << std::endl;
if (states.test(STATE_VISIBLE)) std::cout << " - 可见" << std::endl;
if (states.test(STATE_STUNNED)) std::cout << " - 眩晕" << std::endl;
// ... 其他状态
}
};
int main() {
GameObject player;
player.activate();
player.setVisible(true);
player.states.set(STATE_ATTACKABLE); // 默认可攻击
player.printStates();
std::cout << "玩家是否活跃? " << (player.isActive() ? "是" : "否") << std::endl;
std::cout << "玩家是否可被攻击? " << (player.canBeAttacked() ? "是" : "否") << std::endl;
player.stun();
std::cout << "玩家被眩晕了..." << std::endl;
player.printStates();
std::cout << "玩家是否可被攻击? " << (player.canBeAttacked() ? "是" : "否") << std::endl; // 应该变成否
return 0;
}通过这种方式,你可以用一个
bitset
set
reset
test
canBeAttacked()
在权限控制方面,比如一个用户拥有读、写、删除、管理等权限,你可以为每个权限分配一个位,然后用户的权限集就是一个
bitset
当然,
bitset
bitset
std::vector<bool>
std::map<std::string, bool>
bitset
bitset
bitset
bitset
当你进行
bitset
bs1 & bs2
bitset<128>
我之前在做一些图形渲染相关的算法时,需要对大量的像素掩码进行快速的布尔运算,
bitset
bool
std::vector<bool>
然而,
bitset
std::bitset<N>
N
bitset
std::vector<bool>
std::vector<bool>
bitset
bitset
另一个不算是限制,但需要注意的地方是,
bitset
N
bitset<65>
bool
总的来说,当你确定需要的位数,并且需要进行频繁、高效的位操作时,
bitset
以上就是C++ bitset容器 位操作与标志管理的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号