位示图是利用二进制的一位来表示磁盘中的一个盘块的使用情况。当其值为“0”时,表示对应的盘块空闲;为“1”时,表示已经分配。有的系统把"0"作为盘块已分配的标记,把“1”作为空闲标志。(它们的本质上是相同的,都是用一位的两种状态标志空闲和已分配两种情况。)磁盘上的所有盘块都有一个二进制位与之对应,这样,由所有盘块所对应的位构成一个集合,称为位示图。
1. 定义:
位示图(bitmap)又叫位图,它的最小单元是一个bit。每个bit有两种取值1或0。
位示图是一种非常常用的结构,在索引,数据压缩等方面有广泛应用。
2. 实现
在C/C++中没有位示图这种数据类型,下面我们利用int来实现一个位示图类
每个int有sizeof(int)*8个bit
#include<cassert>
#include<iostream>
using namespace std;
#define INT_BIT sizeof(int)
#define MAX 1024*1024*1024
#define SHIFT 5
#define UNIT INT_BIT << 3 // INT_BIT * 2^3
#define MASK 0x1f
class BitSet
{
public:
BitSet(int maxSize = MAX)
:_msize(maxSize)
{
pBitset = new int[_msize / UNIT + 1];
}
~BitSet()
{
if (pBitset){
delete[] pBitset;
}
}
void set(int i)
{
assert(i<_msize);
// i >> SHIFT = i / (2^5)
// i & MASK = i %
int j = i;
if (j>UNIT){
j >>= SHIFT;
}
pBitset[j] |= 1 << (i & MASK);
}
void clear(int i)
{
assert(i<_msize);
int j = i;
if (j>UNIT){
j >>= SHIFT;
}
pBitset[j] &= ~(1 << (i & MASK));
}
bool test(int i)
{
assert(i<_msize);
int j = i;
if (j>UNIT){
j >>= SHIFT;
}
return (pBitset[j] & (1 << (i & MASK)));
}
private:
int _msize;
int *pBitset;
};
int main()
{
BitSet bitset(100);
int i = 80;
bitset.set(i);
if (bitset.test(i)){
cout << "the pos " << i << " is seted" << endl;
}
else{
cout << "the pos " << i << " is not seted" << endl;
}
bitset.clear(i);
if (bitset.test(i)){
cout << "the pos " << i << " is seted" << endl;
}
else{
cout << "the pos " << i << " is not seted" << endl;
}
}