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

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

c++如何实现一个简单的BitSet_c++位集数据结构与操作【源码】-第1张图片-佛山资讯网

用 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>};

登录后复制

使用示例

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>}

登录后复制

标签: word ai c++ 标准库

发布评论 0条评论)

还木有评论哦,快来抢沙发吧~