位数组

如果某类对象只有两种值,我们只需要一个二进制位就能表示该对象。这样,一个32位整型数就能表示32个对象。位数组就是用来存储这种对象的数组。其内部为整数数组,整数的每一位都表示一个对象。若按正常方式存储对象,则至少要8位存储空间,使用位数组大大降低了存储需求。值得注意的是,位数组只能存储只有两种值的元素。

下面是我写的一个位数组的简单C++实现:

#ifndef BIT_ARRAY_H
#define BIT_ARRAY_H

class BitArray {
public:
  typedef unsigned int size_type;
  typedef int int_type;
  BitArray(size_type _size = sizeof(int_type) << 3):_size(_size) { init(); }
  BitArray(BitArray &rhs):_size(rhs._size) {
    init();
    size_type ia_size = (_size - 1) / sizeof(int_type) >> 3 + 1;
    for (size_type i = 0; i != ia_size; ++i) {
      _ia[i] = rhs._ia[i];
    }
  }
  ~BitArray() { destroy(); }
  bool get(size_type i) {
    size_type bi = bit_index(i), ii = int_index(i);
    return _ia[ii] & 1 << bi;
  }
  void set(size_type i) {
    size_type bi = bit_index(i), ii = int_index(i);
    _ia[ii] |= 1 << bi;
  }
  void reset(size_type i) {
    size_type bi = bit_index(i), ii = int_index(i);
    _ia[ii] &= ~(1 << bi);
  }
  size_type size() { return _size; }
private:
  size_type _size;
  int_type *_ia;
  BitArray& operator=(BitArray &rhs);
  void init() {
    if (!_size) return ;
    size_type int_size = sizeof(int_type);
    size_type ia_size = ((_size - 1) / int_size >> 3) + 1; 
    _ia = new int_type[ia_size]();
  }
  void destroy() {
    delete[] _ia;
  }
  size_type bit_index(size_type i) { return i & (sizeof(size_type) << 3) - 1; }
  size_type int_index(size_type i) { return i / sizeof(size_type) >> 3; }    
};

#endif


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值