c++如何实现一个位图 c++ Bitmap数据结构【实例】

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

在C++中实现一个轻量、实用的位图(Bitmap)数据结构,核心是用字节数组按位存储布尔状态,适合海量标志位管理(如布隆过滤器、内存池标记、位集压缩等)。下面是一个简洁、可直接运行的实例,支持动态大小、位操作和基础接口。

位图类设计要点

使用std::vector存储原始字节,通过位运算计算索引和偏移。不依赖std::bitset(因其大小需编译期确定),而是支持运行时指定容量(以位为单位)。

  • 每个字节存8个bit,第i位对应位置i / 8的字节中第i % 8
  • 位操作用(1U 生成掩码,避免魔术数
  • 构造时自动按需分配字节数:(n_bits + 7) / 8

完整可运行代码示例

以下是一个带注释的Bitmap类实现:

// Bitmap.h

#include
#include
#include

class Bitmap {
private:
  std::vector data_;
  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)提升批量处理效率

这个实现简洁、无外部依赖、内存紧凑,适合嵌入式、高频标记场景或作为更复杂数据结构(如稀疏数组、布隆过滤器)的基础组件。