广西城乡和住房建设厅网站首页爱站工具包官网下载
2026/4/3 13:29:05 网站建设 项目流程
广西城乡和住房建设厅网站首页,爱站工具包官网下载,网站建设软件sh,微信24小时人工申诉概述bitset 是 C 标准模板库#xff08;STL#xff09;中的一个容器类#xff0c;专门用于存储和操作固定大小的二进制位序列。它在内存使用和位操作性能方面非常高效。基本特性1. 头文件#include bitset2. 模板声明templatesize_t N class bitset;N#x…概述bitset是 C 标准模板库STL中的一个容器类专门用于存储和操作固定大小的二进制位序列。它在内存使用和位操作性能方面非常高效。基本特性1. 头文件#include bitset2. 模板声明templatesize_t N class bitset;Nbitset 的大小位数在编译时确定3. 特点固定大小编译时确定每位存储一个二进制值0 或 1内存高效每位只占 1 bit理论值支持各种位操作创建和初始化基本创建方式// 默认构造所有位初始化为 0 bitset8 b1; // 00000000 // 使用整数初始化 bitset8 b2(42); // 00101010 (42的二进制) // 使用字符串初始化 bitset8 b3(101010); // 00101010 bitset8 b4(101010, 4); // 从字符串前4位初始化00001010 // 使用字符串和偏移量 bitset8 b5(10101010, 4, 3); // 从第4位开始取3位00000101常用操作1. 访问元素bitset8 bs(10101010); // 使用 [] 运算符访问不进行边界检查 bool bit0 bs[0]; // 0最右位 bool bit7 bs[7]; // 1最左位 // 使用 test() 方法进行边界检查 bool bit bs.test(0); // 返回第0位的值 // bs.test(8); // 如果位置无效会抛出 out_of_range 异常 // 访问所有位 for (size_t i 0; i bs.size(); i) { cout bs[i]; }2. 设置和重置位bitset8 bs; bs.set(); // 所有位设置为111111111 bs.set(2); // 设置第2位为1 bs.set(2, 0); // 设置第2位为0 bs.set(2, true); // 设置第2位为true1 bs.reset(); // 所有位重置为000000000 bs.reset(2); // 重置第2位为0 bs.flip(); // 所有位取反 bs.flip(2); // 第2位取反3. 查询状态bitset8 bs(10101010); bs.any(); // 是否有任何位为1 true bs.none(); // 是否所有位都为0 false bs.all(); // 是否所有位都为1 false bs.count(); // 为1的位的数量4 bs.size(); // 总位数8位运算操作bitset支持所有标准位运算bitset8 b1(11001100); bitset8 b2(10101010); // 位运算 bitset8 b_and b1 b2; // 10001000 bitset8 b_or b1 | b2; // 11101110 bitset8 b_xor b1 ^ b2; // 01100110 bitset8 b_not ~b1; // 00110011 // 移位运算 bitset8 b_shift_left b1 2; // 00110000 bitset8 b_shift_right b1 2; // 00110011类型转换bitset8 bs(10101010); // 转换为字符串 string s bs.to_string(); // 10101010 string s2 bs.to_string(o, x); // xoxoxoxo // 转换为整数 unsigned long ul bs.to_ulong(); // 170 unsigned long long ull bs.to_ullong(); // 170实际应用示例示例1权限管理系统cppenum Permission { READ 0, WRITE 1, EXECUTE 2, DELETE 3, SHARE 4 }; class UserPermissions { private: bitset5 permissions; // 5种权限 public: void grant(Permission p) { permissions.set(p); } void revoke(Permission p) { permissions.reset(p); } bool hasPermission(Permission p) const { return permissions.test(p); } void toggle(Permission p) { permissions.flip(p); } void display() const { cout Permissions: permissions endl; cout Read: hasPermission(READ) endl; cout Write: hasPermission(WRITE) endl; cout Execute: hasPermission(EXECUTE) endl; } };示例2质数筛选埃拉托斯特尼筛法cppvectorint sieveOfEratosthenes(int n) { bitset1000000 is_prime; is_prime.set(); // 初始假设所有数都是质数 is_prime[0] is_prime[1] 0; // 0和1不是质数 for (int i 2; i * i n; i) { if (is_prime[i]) { for (int j i * i; j n; j i) { is_prime[j] 0; } } } vectorint primes; for (int i 2; i n; i) { if (is_prime[i]) { primes.push_back(i); } } return primes; }示例3状态标志管理cppclass SystemStatus { private: bitset8 status; public: enum StatusFlag { NETWORK_CONNECTED 0, DISK_READY 1, MEMORY_OK 2, CPU_IDLE 3, BATTERY_LOW 4, ERROR_STATE 5, WARNING 6, MAINTENANCE 7 }; void setFlag(StatusFlag flag, bool value) { status.set(flag, value); } bool checkFlag(StatusFlag flag) const { return status.test(flag); } // 检查系统是否就绪网络连接、磁盘就绪、内存正常 bool isSystemReady() const { bitset8 readyMask; readyMask.set(NETWORK_CONNECTED); readyMask.set(DISK_READY); readyMask.set(MEMORY_OK); return (status readyMask) readyMask; } // 获取错误状态 bool hasErrors() const { return status.test(ERROR_STATE); } };性能特点优点内存效率高1位/元素比bool数组通常1字节/元素更省内存操作速度快位操作在硬件级别非常快线程安全不同 bitset 对象可以安全地在不同线程中使用限制固定大小编译时必须知道大小不能动态调整不能像 vector 那样动态增长大小限制受模板参数类型限制与替代方案的比较vsvectorboolcpp// bitset - 固定大小更高效 bitset1000 bs; // vectorbool - 动态大小但可能效率较低 vectorbool vb(1000);vs 整数位操作cpp// 使用整数 unsigned int flags 0; flags | (1 2); // 设置第2位 // 使用 bitset更安全功能更丰富 bitset32 bs; bs.set(2);最佳实践建议适用场景固定大小的位标志集合需要高效位操作的场景内存受限的环境注意事项访问越界时[]运算符未定义行为test()会抛出异常转换为整数时注意溢出对于非常大的 bitset考虑内存占用性能提示批量操作通常比单个操作更高效考虑使用位运算而不是循环操作单个位总结bitset是 C 中处理固定大小位集合的强大工具特别适合需要高效位操作的场景。虽然它缺乏动态调整大小的能力但其卓越的性能和内存效率使其在许多应用中成为首选如状态标志管理、权限系统、算法实现如质数筛选等。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询