如果某类对象只有两种值,我们只需要一个二进制位就能表示该对象。这样,一个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