全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

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

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

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

基本设计思路

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

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

// BitSet.h

#include 
#include
#include

class BitSet {
private:
std::vector data;
size_t num_bits;

static constexpr size_t BITS_PER_WORD = 32;
size_t word_index(size_t pos) const { return pos / BITS_PER_WORD; }
size_t bit_offset(size_t pos) const { return pos % BITS_PER_WORD; }

public:
explicit BitSet(size_t n) : num_bits(n),
data((n + BITS_PER_WORD - 1) / BITS_PER_WORD, 0) {}

void set(size_t pos) {
if (pos >= num_bits) throw std::out_of_range("BitSet::set: index out of range");
data[word_index(pos)] |= (1U << bit_offset(pos));
}

void reset(size_t pos) {
if (pos >= num_bits) throw std::out_of_range("BitSet::reset: index out of range");
data[word_index(pos)] &= ~(1U << bit_offset(pos));
}

bool test(size_t pos) const {
if (pos >= num_bits) throw std::out_of_range("BitSet::test: index out of range");
return data[word_index(pos)] & (1U << bit_offset(pos));
}

void flip(size_t pos) {
if (pos >= num_bits) throw std::out_of_range("BitSet::flip: index out of range");
data[word_index(pos)] ^= (1U << bit_offset(pos));
}

size_t size() const { return num_bits; }
size_t num_words() const { return data.size(); }

// 可选:批量设置/清空全部
void set_all() {
for (auto& w : data) w = ~0U;
// 最后一个字可能越界,需掩码处理(略,可按需扩展)
}

void reset_all() {
data.assign(data.size(), 0);
}
};

使用示例

int main() {
BitSet bs(100); // 支持 0~99 共 100 个 bit

bs.set(5);
bs.set(10);
bs.flip(5); // 5 变成 0

std::cout << bs.test(5) << " "; // 输出 0
std::cout << bs.test(10) << "\n"; // 输出 1

return 0;
}

进阶建议(可选扩展)

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

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


# word  # ai  # c++  # 标准库  # count  # 整型  # 数据结构  # operator  # 可选  # 进阶  # 就能  # 不需要  # 遍历  # 布尔  # 为例  # 一个字  # 大容量  # 清空 


相关文章: 建站VPS配置与SEO优化指南:关键词排名提升策略  如何通过虚拟机搭建网站?详细步骤解析  国美网站制作流程,国美电器蒸汽鍋怎么用官方网站?  弹幕视频网站制作教程下载,弹幕视频网站是什么意思?  如何快速搭建高效WAP手机网站吸引移动用户?  建站之星展会模版如何一键下载生成?  宝塔建站助手安装配置与建站模板使用全流程解析  如何用PHP工具快速搭建高效网站?  建站上市公司网站建设方案与SEO优化服务定制指南  如何通过宝塔面板实现本地网站访问?  建站主机系统SEO优化与智能配置核心关键词操作指南  建站之星导航菜单设置与功能模块配置全攻略  详解ASP.NET 生成二维码实例(采用ThoughtWorks.QRCode和QrCode.Net两种方式)  建站之星代理平台如何选择最佳方案?  如何在服务器上三步完成建站并提升流量?  如何用低价快速搭建高质量网站?  javascript中对象的定义、使用以及对象和原型链操作小结  Swift开发中switch语句值绑定模式  JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)  长沙企业网站制作哪家好,长沙水业集团官方网站?  如何用VPS主机快速搭建个人网站?  北京制作网站的公司排名,北京三快科技有限公司是做什么?北京三快科技?  制作网站的网址是什么,请问后缀为.com和.com.cn还有.cn的这三种网站是分别是什么类型的网站?  如何登录建站主机?访问步骤全解析  购物网站制作费用多少,开办网上购物网站,需要办理哪些手续?  如何选购建站域名与空间?自助平台全解析  如何在万网自助建站平台快速创建网站?  如何在IIS中新建站点并配置端口与IP地址?  微课制作网站有哪些,微课网怎么进?  红河网站制作公司,红河事业单位身份证如何上传?  厦门模型网站设计制作公司,厦门航空飞机模型掉色怎么办?  哪家制作企业网站好,开办像阿里巴巴那样的网络公司和网站要怎么做?  零基础网站服务器架设实战:轻量应用与域名解析配置指南  如何设置并定期更换建站之星安全管理员密码?  如何基于云服务器快速搭建个人网站?  如何高效搭建专业期货交易平台网站?  如何快速使用云服务器搭建个人网站?  手机怎么制作网站教程步骤,手机怎么做自己的网页链接?  个人摄影网站制作流程,摄影爱好者都去什么网站?  桂林网站制作公司有哪些,桂林马拉松怎么报名?  黑客如何通过漏洞一步步攻陷网站服务器?  微信h5制作网站有哪些,免费微信H5页面制作工具?  建站IDE高效指南:快速搭建+SEO优化+自适应模板全解析  制作公司内部网站有哪些,内网如何建网站?  在线制作视频的网站有哪些,电脑如何制作视频短片?  网站制作与设计教程,如何制作一个企业网站,建设网站的基本步骤有哪些?  简历在线制作网站免费版,如何创建个人简历?  如何用wdcp快速搭建高效网站?  沈阳个人网站制作公司,哪个网站能考到沈阳事业编招聘的信息?  台州网站建设制作公司,浙江手机无犯罪记录证明怎么开? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。