位示图

位示图是利用二进制的一位来表示磁盘中的一个盘块的使用情况。当其值为“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;
    }
}

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值