C++轻量位图用vector动态存储,支持运行时指定位数,通过位运算实现set/reset/test操作,内存紧凑高效。
在C++中实现一个轻量、实用的位图(Bitmap)数据结构,核心是用字节数组按位存储布尔状态,适合海量标志位管理(如布隆过滤器、内存池标记、位集压缩等)。下面是一个简洁、可直接运行的实例,支持动态大小、位操作和基础接口。
使用std::vector
以下是一个带注释的Bitmap类实现:
// Bitmap.h
#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;
}
若需更高性能或更多功能,可考虑:
这个实现简洁、无外部依赖、内存紧凑,适合嵌入式、高频标记场景或作为更复杂数据结构(如稀疏数组、布隆过滤器)的基础组件。