C++轻量位图用vector动态存储,支持运行时指定位数,通过位运算实现set/reset/test操作,内存紧凑高效。

在C++中实现一个轻量、实用的位图(Bitmap)数据结构,核心是用字节数组按位存储布尔状态,适合海量标志位管理(如布隆过滤器、内存池标记、位集压缩等)。下面是一个简洁、可直接运行的实例,支持动态大小、位操作和基础接口。
位图类设计要点
使用std::vector
- 每个字节存8个bit,第i位对应位置i / 8的字节中第i % 8位
- 位操作用(1U 生成掩码,避免魔术数
- 构造时自动按需分配字节数:(n_bits + 7) / 8
完整可运行代码示例
以下是一个带注释的Bitmap类实现:
// Bitmap.h
立即学习“C++免费学习笔记(深入)”;
#include
#include
#include
class Bitmap {
private:
std::vector
size_t n_bits_;
public:
// 构造:支持0初始化或指定初始值
explicit Bitmap(size_t n_bits, bool init = false) : n_bits_(n_bits) {
size_t n_bytes = (n_bits + 7) / 8;
data_.resize(n_bytes, init ? 0xFF : 0x00);
}
// 设置第i位为true
void set(size_t i) {
if (i >= n_bits_) return;
size_t byte_idx = i / 8;
uint8_t bit_mask = 1U data_[byte_idx] |= bit_mask;
}
// 清除第i位(设为false)
void reset(size_t i) {
if (i >= n_bits_) return;
size_t byte_idx = i / 8;
uint8_t bit_mask = ~(1U data_[byte_idx] &= bit_mask;
}
// 获取第i位值
bool test(size_t i) const {
if (i >= n_bits_) return false;
size_t byte_idx = i / 8;
uint8_t bit_mask = 1U return (data_[byte_idx] & bit_mask) != 0;
}
// 全部置0
void reset_all() { data_.assign(data_.size(), 0x00); }
// 返回总位数
size_t size() const { return n_bits_; }
};
简单使用示例
// main.cpp
#include "Bitmap.h"
#include iostream>
int main() {
Bitmap bm(100); // 支持0~99共100个位
bm.set(5);
bm.set(23);
bm.set(99);
std::cout std::cout std::cout
bm.reset(23);
std::cout
return 0;
}
进阶建议(可选扩展)
若需更高性能或更多功能,可考虑:
- 添加flip()(翻转某一位)、count_ones()(统计置位数,可用__builtin_popcount或查表法)
- 支持范围操作(如set_range(start, len))
- 增加迭代器接口,方便STL算法配合使用
- 对齐优化:按64位整数操作(uint64_t)提升批量处理效率
这个实现简洁、无外部依赖、内存紧凑,适合嵌入式、高频标记场景或作为更复杂数据结构(如稀疏数组、布隆过滤器)的基础组件。










