c++如何实现一个简单的BitSet_c++位集数据结构与操作【源码】


C++手写BitSet通过uint32_t数组按位存储布尔值,支持set/reset/test/flip等操作;核心是将位位置映射到数组下标和位偏移,用位运算高效操作,不依赖标准库bitset。

c++如何实现一个简单的bitset_c++位集数据结构与操作【源码】

用 C++ 实现一个简单的 BitSet,核心是用整型数组(如 uint32_tunsigned long)按位存储布尔状态,通过位运算高效操作。不需要依赖 <bitset></bitset>,自己手写更灵活、便于理解底层原理。

基本设计思路

把 N 个 bit 映射到长度为 (N + 31) / 32uint32_t 数组上(以 32 位为例):
- 第 i 个 bit 对应数组下标 i / 32,位偏移 i % 32
- 用 |= 置位,&= ~ 清位,& 查位
- 支持构造、置位(set)、清位(reset)、查询(test)、翻转(flip)等操作

完整可运行源码(C++11 及以上)

// BitSet.h

#include <cstdint><br>#include <vector><br>#include <stdexcept><br><br>class BitSet {<br>private:<br>    std::vector<uint32_t> data;<br>    size_t num_bits;<br><br>    static constexpr size_t BITS_PER_WORD = 32;<br>    size_t word_index(size_t pos) const { return pos / BITS_PER_WORD; }<br>    size_t bit_offset(size_t pos) const { return pos % BITS_PER_WORD; }<br><br>public:<br>    explicit BitSet(size_t n) : num_bits(n),<br>        data((n + BITS_PER_WORD - 1) / BITS_PER_WORD, 0) {}<br><br>    void set(size_t pos) {<br>        if (pos >= num_bits) throw std::out_of_range("BitSet::set: index out of range");<br>        data[word_index(pos)] |= (1U << bit_offset(pos));<br>    }<br><br>    void reset(size_t pos) {<br>        if (pos >= num_bits) throw std::out_of_range("BitSet::reset: index out of range");<br>        data[word_index(pos)] &= ~(1U << bit_offset(pos));<br>    }<br><br>    bool test(size_t pos) const {<br>        if (pos >= num_bits) throw std::out_of_range("BitSet::test: index out of range");<br>        return data[word_index(pos)] & (1U << bit_offset(pos));<br>    }<br><br>    void flip(size_t pos) {<br>        if (pos >= num_bits) throw std::out_of_range("BitSet::flip: index out of range");<br>        data[word_index(pos)] ^= (1U << bit_offset(pos));<br>    }<br><br>    size_t size() const { return num_bits; }<br>    size_t num_words() const { return data.size(); }<br><br>    // 可选:批量设置/清空全部<br>    void set_all() {<br>        for (auto& w : data) w = ~0U;<br>        // 最后一个字可能越界,需掩码处理(略,可按需扩展)<br>    }<br><br>    void reset_all() {<br>        data.assign(data.size(), 0);<br>    }<br>};

Android创建和使用数据库详细指南 中文WORD版 Android创建和使用数据库详细指南 中文WORD版

每个应用程序都要使用数据,Android应用程序也不例外,Android使用开源的、与操作系统无关的SQL数据库--SQLite,本文介绍的就是如何为你的Android应用程序创建和操作SQLite数据库。 数据库支持每个应用程序无论大小的生命线,除非你的应用程序只处理简单的数据,那么就需要一个数据库系统存储你的结构化数据,Android使用SQLite数据库,它是一个开源的、支持多操作系统的SQL数据库,在许多领域广泛使用,如Mozilla FireFox就是使用SQLite来存储配置数据的,iPhon

Android创建和使用数据库详细指南 中文WORD版 0 查看详情 Android创建和使用数据库详细指南 中文WORD版

使用示例

int main() {<br>    BitSet bs(100);  // 支持 0~99 共 100 个 bit<br><br>    bs.set(5);<br>    bs.set(10);<br>    bs.flip(5);     // 5 变成 0<br><br>    std::cout << bs.test(5) << " ";   // 输出 0<br>    std::cout << bs.test(10) << "\n"; // 输出 1<br><br>    return 0;<br>}

进阶建议(可选扩展)

- 支持模板参数指定字长(如 uint64_t),提升大容量性能
- 添加 count():用内置函数 __builtin_popcount(GCC/Clang)或查表法统计 1 的个数
- 实现 operator[] 返回代理类,支持 bs[5] = true 写法
- 增加迭代器,方便遍历所有置位位置(如找下一个 1 的位置)
- 加入边界检查开关(debug 模式开启,release 模式关闭)提升效率

基本上就这些。手写 BitSet 不复杂但容易忽略越界和字对齐细节,抓住“分块+位偏移”这个关键,就能稳稳落地。

以上就是c++++如何实现一个简单的BitSet_c++位集数据结构与操作【源码】的详细内容,更多请关注其它相关文章!


# 游戏开发  # 上海奉贤网站建设推广  # SEO基础会计考证  # 宿州短视频seo优化  # 新营销推广课后答案  # 977黑帽seo  # 营销云推广力度  # 武汉外贸网站推广厂家  # 东宝seo搜索推广  # 福州高端品牌网站建设  # 无锡关键词排名方法  # 进阶  # word  # 如何用  # 开源  # 如何使用  # 可选  # 整型  # 数据结构  # 应用程序  # 如何实现  # 标准库  # c++  # ai 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 优化推广96088 】 【 技术知识133117 】 【 IDC资讯59369 】 【 网络运营7196 】 【 IT资讯61894


相关推荐: windows10怎么开启wsl_windows10安装linux子系统教程  win11如何运行chkdsk命令 Win11检查和修复磁盘逻辑错误教程【修复】  vivo浏览器怎么离线保存网页 vivo浏览器下载完整页面以便无网络时阅读  KFC邀请码怎么使用领额外优惠_KFC邀请码输入方式与额外优惠代码获取方法  mysql离线安装后如何启动_mysql离线安装完成后启动服务的方法  谷歌浏览器官方镜像获取方法_谷歌浏览器网页版入口极速直达  Win10截图远程协助 Win10远程桌面截屏法【场景应用】  139邮箱登录入口官网 139邮箱登录入口官网网址  火狐浏览器无法自动更新怎么办 手动更新火狐浏览器到最新版本【解决】  《狐友》联系客服方法  Dash应用多值文本输入处理与类型转换教程  sublime如何自定义文件类型图标_AFileIcon插件的主题切换与个性化配置  奥克斯空调不制热啥毛病_奥克斯空调不制热原因分析及解决技巧  如何测试您的网站全球打开速度-网站海外测速工  如何定制PrimeNG Sidebar的背景颜色  青橙手机语音助手怎么唤醒_青橙手机语音助手设置与唤醒方法  如何快速去除厨房重油污? 2025年最好用的厨房清洁剂推荐  教育查询官方网站入口 教育个人档案查询免费官网  edge浏览器怎么修改语言为中文_Edge界面语言切换教程  网页版网易云音乐入口_网易云音乐在线官网登录  《米姆米姆哈》米姆获取及技能攻略  食品生产用水只要符合国家规定的生活饮用水卫生标准就可以吗  《战地6》反作弊已成功拦截240万次作弊 发售第一周98%比赛没有作弊  酷狗音乐多音轨设置教程  PDF如何批量加注释_PDF多文件批注高亮操作教程  Golang如何使用log记录日志信息_Golang log日志记录方法总结  《暗黑破坏神4》国服回归送狂欢礼包 价值6916元  AO3永久镜像入口开放_AO3最新网址兼容所有浏览器  《360浏览器》自动保存账号密码设置方法  Python项目中的条件导入:解决跨模块依赖问题  德邦快递查询入口登录官网 德邦快递单号查询系统入口  POKI小游戏在线免费入口链接 POKI小游戏无下载秒玩玩  吃完饭就犯困是什么原因 餐后嗜睡如何缓解  三星A55应用闪退排查步骤_Samsung A55稳定性优化技巧  QQ邮箱手机版网页版 QQ邮箱登录入口地址  第五人格PC版怎么避免被封号_第五人格PC版防封号注意事项  家里的小飞虫总是不断,用什么方法可以彻底根除?  4399小游戏下装链接 4399小游戏下载链接入口  如何在CSS中使用伪类:valid实现表单验证提示_结合:valid改变边框颜色  稻壳阅读器官方直达网址链接 稻壳阅读器文档阅读平台主页资源入口  《画加》约稿流程  抖音火山版如何进行提现  《磁力猫》最好用的磁官网  毒蘑菇VOLUMESHADER_BM官网首页登录入口 毒蘑菇VOLUMESHADER_BM官网首页登录入口说明  Yandex无需登录畅游 俄罗斯搜索引擎最新官网指南  Firefox OS应用开发:解决XMLHttpRequest跨域请求阻塞问题  sublime怎么在文件中显示代码结构大纲_sublime符号列表功能  《真我》申请退款方法  百度浏览器无法安装扩展程序_百度浏览器插件安装失败原因解析  空腹吃苹果好吗 苹果空腹摄入指南 

 2025-12-19

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

运城市盐湖区信雨科技有限公司


运城市盐湖区信雨科技有限公司

运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。

 8156699

 13765294890

 8156699@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.