news 2026/4/16 11:40:46

C++ STL bitset 位图

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C++ STL bitset 位图

概述

bitset是 C++ 标准模板库(STL)中的一个容器类,专门用于存储和操作固定大小的二进制位序列。它在内存使用和位操作性能方面非常高效。

基本特性

1. 头文件

#include <bitset>

2. 模板声明

template<size_t N> class bitset;
  • N:bitset 的大小(位数),在编译时确定

3. 特点

  • 固定大小,编译时确定

  • 每位存储一个二进制值(0 或 1)

  • 内存高效:每位只占 1 bit(理论值)

  • 支持各种位操作

创建和初始化

基本创建方式

// 默认构造:所有位初始化为 0 bitset<8> b1; // 00000000 // 使用整数初始化 bitset<8> b2(42); // 00101010 (42的二进制) // 使用字符串初始化 bitset<8> b3("101010"); // 00101010 bitset<8> b4("101010", 4); // 从字符串前4位初始化:00001010 // 使用字符串和偏移量 bitset<8> b5("10101010", 4, 3); // 从第4位开始取3位:00000101

常用操作

1. 访问元素

bitset<8> 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. 设置和重置位

bitset<8> bs; bs.set(); // 所有位设置为1:11111111 bs.set(2); // 设置第2位为1 bs.set(2, 0); // 设置第2位为0 bs.set(2, true); // 设置第2位为true(1) bs.reset(); // 所有位重置为0:00000000 bs.reset(2); // 重置第2位为0 bs.flip(); // 所有位取反 bs.flip(2); // 第2位取反

3. 查询状态

bitset<8> bs("10101010"); bs.any(); // 是否有任何位为1? true bs.none(); // 是否所有位都为0? false bs.all(); // 是否所有位都为1? false bs.count(); // 为1的位的数量:4 bs.size(); // 总位数:8

位运算操作

bitset支持所有标准位运算:

bitset<8> b1("11001100"); bitset<8> b2("10101010"); // 位运算 bitset<8> b_and = b1 & b2; // 10001000 bitset<8> b_or = b1 | b2; // 11101110 bitset<8> b_xor = b1 ^ b2; // 01100110 bitset<8> b_not = ~b1; // 00110011 // 移位运算 bitset<8> b_shift_left = b1 << 2; // 00110000 bitset<8> b_shift_right = b1 >> 2; // 00110011

类型转换

bitset<8> 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:权限管理系统

cpp

enum Permission { READ = 0, WRITE = 1, EXECUTE = 2, DELETE = 3, SHARE = 4 }; class UserPermissions { private: bitset<5> 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:质数筛选(埃拉托斯特尼筛法)

cpp

vector<int> sieveOfEratosthenes(int n) { bitset<1000000> 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; } } } vector<int> primes; for (int i = 2; i <= n; ++i) { if (is_prime[i]) { primes.push_back(i); } } return primes; }

示例3:状态标志管理

cpp

class SystemStatus { private: bitset<8> 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 { bitset<8> 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. 内存效率高:1位/元素,比bool数组(通常1字节/元素)更省内存

  2. 操作速度快:位操作在硬件级别非常快

  3. 线程安全:不同 bitset 对象可以安全地在不同线程中使用

限制:

  1. 固定大小:编译时必须知道大小

  2. 不能动态调整:不能像 vector 那样动态增长

  3. 大小限制:受模板参数类型限制

与替代方案的比较

vsvector<bool>

cpp

// bitset - 固定大小,更高效 bitset<1000> bs; // vector<bool> - 动态大小,但可能效率较低 vector<bool> vb(1000);

vs 整数位操作

cpp

// 使用整数 unsigned int flags = 0; flags |= (1 << 2); // 设置第2位 // 使用 bitset(更安全,功能更丰富) bitset<32> bs; bs.set(2);

最佳实践建议

  1. 适用场景

    • 固定大小的位标志集合

    • 需要高效位操作的场景

    • 内存受限的环境

  2. 注意事项

    • 访问越界时,[]运算符未定义行为,test()会抛出异常

    • 转换为整数时注意溢出

    • 对于非常大的 bitset,考虑内存占用

  3. 性能提示

    • 批量操作通常比单个操作更高效

    • 考虑使用位运算而不是循环操作单个位

总结

bitset是 C++ 中处理固定大小位集合的强大工具,特别适合需要高效位操作的场景。虽然它缺乏动态调整大小的能力,但其卓越的性能和内存效率使其在许多应用中成为首选,如状态标志管理、权限系统、算法实现(如质数筛选)等。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/15 20:18:47

Java毕设选题推荐:基于springboot的户外救援系统基于SpringBoot的救援指挥系统【附源码、mysql、文档、调试+代码讲解+全bao等】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/4/16 14:06:44

8个AI论文平台推荐!继续教育学生轻松搞定毕业论文格式规范!

8个AI论文平台推荐&#xff01;继续教育学生轻松搞定毕业论文格式规范&#xff01; AI 工具助力论文写作&#xff0c;让学术之路更轻松 在当前的学术环境中&#xff0c;越来越多的学生和科研工作者开始借助 AI 工具来提升论文写作效率。尤其是在继续教育领域&#xff0c;面对…

作者头像 李华
网站建设 2026/4/16 13:05:22

Pandas 相关性分析

Pandas 相关性分析 引言 在数据分析领域,Pandas 是一个不可或缺的工具。它提供了丰富的数据处理功能,其中相关性分析是数据分析的重要部分。本文将详细介绍 Pandas 相关性分析的基本概念、方法以及实际应用。 相关性分析概述 1. 什么是相关性分析? 相关性分析是研究两个…

作者头像 李华
网站建设 2026/4/16 16:24:04

超高创新!强化学习+深度学习单变量时间序列预测MATLAB代码

基于强化学习自动选择最优深度学习模型的时间序列预测。代码通过强化学习智能体在LSTM、BiLSTM、GRU三种模型中选择最佳模型&#xff0c;然后进行单变量时间序列预测和性能评估。 算法步骤 数据预处理阶段 • 导入数据 • 构建时间序列样本&#xff08;滑动窗口方法&#xff09…

作者头像 李华
网站建设 2026/4/16 16:13:17

AI Agent:智能体的觉醒与自主智能的新纪元

目录 一、 AI Agent的灵魂&#xff1a;感知、推理、行动的永恒循环 二、 Agent的核心驱动力&#xff1a;大型语言模型与工具集成 三、 Agent的形态与应用疆域&#xff1a;从虚拟助手到物理世界的智能执行者 四、 Agent的实现基石&#xff1a;框架、模型与内存机制 五、 AI…

作者头像 李华
网站建设 2026/4/16 14:01:42

Redis分布式锁全攻略:原理、陷阱与Redisson最佳实践

在分布式系统中,分布式锁是保障数据一致性与任务互斥执行的核心手段。Redis因其高性能与广泛应用,成为最常见的分布式锁实现方案。 然而,自研Redis分布式锁暗藏诸多陷阱,如果处理不当,容易出现死锁、误删、超时等严重问题。 本文将全面解析 Redis 分布式锁的 基本原理、常…

作者头像 李华