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

用 C++ 实现一个简单的 BitSet,核心是用整型数组(如 uint32_t 或 unsigned long)按位存储布尔状态,通过位运算高效操作。不需要依赖 <bitset></bitset>,自己手写更灵活、便于理解底层原理。
把 N 个 bit 映射到长度为 (N + 31) / 32 的 uint32_t 数组上(以 32 位为例):
- 第 i 个 bit 对应数组下标 i / 32,位偏移 i % 32
- 用 |= 置位,&= ~ 清位,& 查位
- 支持构造、置位(set)、清位(reset)、查询(test)、翻转(flip)等操作
// 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>};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>}
每个应用程序都要使用数据,Android应用程序也不例外,Android使用开源的、与操作系统无关的SQL数据库--SQLite,本文介绍的就是如何为你的Android应用程序创建和操作SQLite数据库。 数据库支持每个应用程序无论大小的生命线,除非你的应用程序只处理简单的数据,那么就需要一个数据库系统存储你的结构化数据,Android使用SQLite数据库,它是一个开源的、支持多操作系统的SQL数据库,在许多领域广泛使用,如Mozilla FireFox就是使用SQLite来存储配置数据的,iPhon
0
立即学习“C++免费学习笔记(深入)”;
- 支持模板参数指定字长(如 uint64_t),提升大容量性能
- 添加 count():用内置函数 __builtin_popcount(GCC/Clang)或查表法统计 1 的个数
- 实现 operator[] 返回代理类,支持 bs[5] = true 写法
- 增加迭代器,方便遍历所有置位位置(如找下一个 1 的位置)
- 加入边界检查开关(debug 模式开启,release 模式关闭)提升效率
基本上就这些。手写 BitSet 不复杂但容易忽略越界和字对齐细节,抓住“分块+位偏移”这个关键,就能稳稳落地。
以上就是c++++如何实现一个简单的BitSet_c++位集数据结构与操作【源码】的详细内容,更多请关注php中文网其它相关文章!
c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号