新闻中心
C++如何实现一个位图(BitSet)_C++利用位运算高效处理海量数据集合
位图通过二进制位高效表示元素存在状态,使用位运算实现快速操作,相比布尔数组节省32~64倍内存,适用于去重统计、布隆过滤器、内存管理等场景。

在处理海量数据集合时,内存效率和操作速度至关重要。C++中实现一个位图(BitSet)是一种非常高效的方式,利用位运算可以直接对单个比特进行操作,从而大幅节省内存并提升性能。下面介绍如何从零实现一个简单的位图结构,并说明其核心原理与应用场景。
位图的基本原理
位图使用一个二进制位来表示一个元素的存在状态(0 表示不存在,1 表示存在)。假设要表示区间 [0, n) 内的整数集合,只需要 n 个比特即可。相比使用布尔数组或哈希集合,位图在空间上具有极大优势——理论上可节省 32~64 倍内存(取决于机器字长)。
例如:表示 100 万个整数的存在性,用 bool 数组需要约 1MB,而用位图仅需约 125KB。
核心数据结构与位运算操作
我们使用 unsigned int 或 unsigned long long 类型的数组作为底层存储,每个元素称为“字”(word),每个字管理多个比特。
关键在于通过位运算快速定位和修改某一位:
- 确定所在字的位置:index / bits_per_word
- 确定在字内的偏移:index % bits_per_word
- 设置某位为1:data[word_index] |= (1U
- 设置某位为0:data[word_index] &= ~(1U
- 查询某位是否为1:(data[word_index] & (1U
注意:位移操作应确保不越界,且使用无符号类型避免未定义行为。
拾贝
一键同步微信读书所有笔记和划线,并在新标签页回顾
186
查看详情
简易 BitSet 实现示例
以下是一个轻量级的 BitSet 类实现:
<font face="Courier New">
class BitSet {
private:
unsigned int* data;
size_t size_in_bits;
static const size_t BITS_PER_WORD = 32;
<p>public:
BitSet(size_t n) : size_in_bits(n) {
size_t nu
m_words = (n + BITS_PER_WORD - 1) / BITS_PER_WORD;
data = new unsigned int[num_words]{};
}</p><pre class='brush:php;toolbar:false;'>~BitSet() {
delete[] data;
}
void set(size_t index) {
if (index >= size_in_bits) return;
size_t word = index / BITS_PER_WORD;
size_t bit = index % BITS_PER_WORD;
data[word] |= (1U << bit);
}
void reset(size_t index) {
if (index >= size_in_bits) return;
size_t word = index / BITS_PER_WORD;
size_t bit = index % BITS_PER_WORD;
data[word] &= ~(1U << bit);
}
bool test(size_t index) const {
if (index >= size_in_bits) return false;
size_t word = index / BITS_PER_WORD;
size_t bit = index % BITS_PER_WORD;
return (data[word] & (1U << bit)) != 0;
}};
使用方式简单直观:
<font face="Courier New">
BitSet bs(1000); // 支持 0~999
bs.set(10);
bs.set(500);
if (bs.test(10)) {
// 执行逻辑
}
</font>典型应用场景
位图特别适合以下场景:
- 去重统计:如日活跃用户标记,ID 范围已知时可用 BitSet 高效记录
- 布隆过滤器底层结构:配合哈希函数实现概率性判断
- 内存池管理:操作系统或自定义分配器中标记块是否空闲
- 排序与查找优化:对小范围整数排序,遍历 BitSet 即可输出有序序列
基本上就这些。掌握位图不仅提升对位运算的理解,也增强了处理大数据集时的空间优化能力。实际项目中也可直接使用 std::bitset(固定大小)或 std::vector
以上就是C++如何实现一个位图(BitSet)_C++利用位运算高效处理海量数据集合的详细内容,更多请关注其它相关文章!
# 运算符
# 网站推广seo66云刂速刂捷
# 长沙网站seo如何优化价格
# 昆明长沙seo费用信誉保障
# 抖音营销推广商品有哪些
# 抖音的推广算不算营销
# 湖北什么是营销推广技巧
# 王小平seo
# 广州抖音seo搜索广告
# 餐饮网站建设效果好
# 谷歌seo自然搜索排名多少
# 是一个
# word
# 如何使用
# 布尔
# 拾贝
# 进阶
# 递归
# 如何实现
# 数据结构
# c++
# 大数据
# 操作系统
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
抓大鹅无需下载版 抓大鹅秒玩版入口
QQ邮箱网页版登录入口 QQ邮箱官方在线使用平台
c++如何使用TBB库进行任务并行_c++ Intel线程构建模块
Golang如何优雅处理error_Golang error处理最佳实践总结
Yandex浏览器官方网页版入口 Yandex浏览器最新版官网
如何创建没有密码的Windows本地账户_跳过微软账户登录的技巧【教程】
Win10怎么设置静态IP地址 Win10手动配置IP地址步骤【指南】
解决 MongoDB 聚合查询中对象数组 _id 匹配问题
poki网页游戏推荐_poki免费游戏平台入口
Log4j Console Appender性能瓶颈与高并发优化策略
极速漫画官方主页网址 极速漫画漫画在线浏览官网链接
如何在CSS中使用visited与link控制链接颜色_visited link伪类配合
淘宝支付提示失败如何解决 淘宝支付流程优化方法
Win10磁盘清理工具在哪 Win10打开并使用磁盘清理【教程】
QQ邮箱正确登录入口_QQ邮箱官方网站使用地址
J*a里如何实现线程安全的懒加载单例_懒加载单例实现方法解析
海棠电脑版入口_通过电脑访问海棠官网阅读
sublime如何配置Go语言开发环境_sublime搭建Golang编译运行系统
mysql如何设置表访问权限_mysql表访问权限配置
如何使用J*aScript精确选择并批量修改特定父元素下子链接的样式
mc.js官网登录入口 mc.js官方登录入口最新版
Win11怎么查看显卡显存 Win11显示适配器属性及专用视频内存查询
韩剧圈正版入口页面_韩剧圈官网登录链接
Composer中的^和~符号代表什么_精通Composer版本号语义化约束
写好的html代码怎么运行出来_运行写好的html代码方法【教程】
我的世界mc.js免费游戏直接能玩 我的世界mc.js小游戏免费秒玩入口
C++如何实现一个装饰器模式_C++设计模式之动态地给对象添加额外职责
响应式容器内容自动缩放与宽高比维持教程
《北京人工智能产业白皮书(2025)》发布:全年核心产值预计突破 4500 亿元
理解J*aScript Promise的微任务队列与执行顺序
实现全屏滚动与导航点:专业教程
夸克AO3官网入口_AO3镜像网站2025推荐
css元素hover动画延迟生效怎么办_使用animation-delay调整触发时间
文心一言怎样用插件调度API数据_文心一言用插件调度API数据【API调用】
怎么在html里运行vbs脚本_html中运行vbs脚本方法【教程】
Sublime Text怎么设置垂直标尺_Sublime配置Rulers规范代码长度
优化Django表单:提交验证失败后保留用户输入
QQ邮箱在线使用入口 QQ邮箱个人账号网页版登录
微信网页版扫码登录入口 微信网页版二维码登录入口
铁路12306改签能改到更早的车次吗_铁路12306改签提前车次规则
Golang如何使用const iota_Go iota常量计数器讲解
Python中如何避免重复条件判断:利用数据结构实现动态逻辑
正确连接J*aScript到HTML实现可点击图片与自定义事件处理
PHP中SSG-WSG API的AES加密实践:正确使用初始化向量
Fabric Mod开发:在1.19.3+版本中正确添加自定义物品并管理物品组
2026年发布! 美少女养成动作RPG《神剑少女战记》发布实机演示
Composer的 "licenses" 命令如何帮助你遵守开源协议_检查项目依赖的许可证合规性
Centos/Linux 系统下安装 composer 的完整步骤
Win11输入法不见了怎么办_Windows11恢复语言栏显示方法
QQ网页版官方账号入口 QQ网页版网页版登录指南


2025-12-05
浏览次数:次
返回列表
m_words = (n + BITS_PER_WORD - 1) / BITS_PER_WORD;
data = new unsigned int[num_words]{};
}</p><pre class='brush:php;toolbar:false;'>~BitSet() {
delete[] data;
}
void set(size_t index) {
if (index >= size_in_bits) return;
size_t word = index / BITS_PER_WORD;
size_t bit = index % BITS_PER_WORD;
data[word] |= (1U << bit);
}
void reset(size_t index) {
if (index >= size_in_bits) return;
size_t word = index / BITS_PER_WORD;
size_t bit = index % BITS_PER_WORD;
data[word] &= ~(1U << bit);
}
bool test(size_t index) const {
if (index >= size_in_bits) return false;
size_t word = index / BITS_PER_WORD;
size_t bit = index % BITS_PER_WORD;
return (data[word] & (1U << bit)) != 0;
}