首页 > 后端开发 > C++ > 正文

c++如何实现一个位集(bitset)_c++位运算与高效状态管理技巧

尼克
发布: 2025-11-12 19:49:02
原创
235人浏览过
C++中位集通过位运算高效管理二进制状态,std::bitset适用于固定大小场景,提供set、test、flip等方法简化操作;动态位集可基于vector<uint64_t>实现,支持任意大小的位存储,核心是通过位编号计算数组索引和偏移量进行定位;常用技巧包括用“|= (1<<n)”设置位、“&= ~(1<<n)”清除位、“^= (1<<n)”翻转位、“(x>>n)&1”检测位,“x &= x-1”清除最低位1,“x & (-x)”提取最低位1,结合popcount等方法优化状态统计,在状压DP、权限控制等场景显著提升性能与空间效率。

c++如何实现一个位集(bitset)_c++位运算与高效状态管理技巧

在C++中,位集(bitset)是一种高效管理二进制状态的工具,特别适用于需要大量布尔标志或状态压缩的场景。它通过位运算直接操作内存中的比特位,节省空间并提升性能。本文介绍如何使用标准库std::bitset,以及如何手动实现一个简易位集,并结合位运算技巧进行高效状态管理。

使用标准 bitset 简化状态管理

C++标准库提供了std::bitset,可以在编译时确定大小的情况下高效操作位序列。

特点包括:

  • 固定大小,性能高
  • 支持按位操作:与、或、异或、取反
  • 提供test()set()reset()等便捷方法

示例:

立即学习C++免费学习笔记(深入)”;

#include <bitset>
#include <iostream>
<p>int main() {
std::bitset<8> flags;         // 8位位集
flags.set(0);                 // 设置第0位为1
flags.set(2);
std::cout << flags << "\n";   // 输出: 00000101</p><pre class='brush:php;toolbar:false;'>if (flags.test(0)) {
    std::cout << "第0位已设置\n";
}

flags.flip();                 // 翻转所有位
std::cout << flags << "\n";   // 输出: 11111010
登录后复制

}

手动实现动态位集(类似 vector<bool>)

当需要动态大小的位集时,可以基于std::vector<unsigned int>uint64_t数组实现。

算家云
算家云

高效、便捷的人工智能算力服务平台

算家云 37
查看详情 算家云

关键点:

  • 用整数数组存储位,每个整数管理32或64位
  • 通过位运算定位具体bit:数组索引 = 位编号 / 位宽,偏移 = 位编号 % 位宽

简易实现示例:

class DynamicBitset {
private:
    std::vector<uint64_t> data;
    size_t n_bits;
<pre class='brush:php;toolbar:false;'>static constexpr int WORD_SIZE = 64;
登录后复制

public: explicit DynamicBitset(size_t bits) : n_bits(bits) { data.resize((bits + WORD_SIZE - 1) / WORD_SIZE, 0); }

void set(size_t pos) {
    if (pos >= n_bits) return;
    data[pos / WORD_SIZE] |= (1ULL << (pos % WORD_SIZE));
}

void reset(size_t pos) {
    if (pos >= n_bits) return;
    data[pos / WORD_SIZE] &= ~(1ULL << (pos % WORD_SIZE));
}

bool test(size_t pos) const {
    if (pos >= n_bits) return false;
    return (data[pos / WORD_SIZE] >> (pos % WORD_SIZE)) & 1;
}
登录后复制

};

常用位运算技巧提升效率

掌握基本位操作能显著提升状态管理效率:

  • 设置某位: mask |= (1 << n)
  • 清除某位: mask &= ~(1 << n)
  • 翻转某位: mask ^= (1 << n)
  • 检查某位: (mask >> n) & 1
  • 清零最低位1: x &= x - 1(常用于统计1的个数)
  • 提取最低位1: lowbit = x & (-x)

例如,快速统计1的个数(汉明重量):

int popcount(uint64_t x) {
    int cnt = 0;
    while (x) {
        x &= x - 1;  // 每次清除最低位的1
        cnt++;
    }
    return cnt;
}
登录后复制

基本上就这些。合理使用std::bitset和位运算,可以在状态压缩、算法优化(如状压DP)、权限控制等场景中大幅降低空间开销并提高运行速度。手动实现时注意边界和类型安全,尤其是位移操作要使用ULL防止溢出。不复杂但容易忽略细节。

以上就是c++++如何实现一个位集(bitset)_c++位运算与高效状态管理技巧的详细内容,更多请关注php中文网其它相关文章!

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号