[算法]使用bitmap高效进行矩阵运算

如果程序中经常要对矩阵进行与或非等运算,可以把整型数组的矩阵转化成char型的bitmap,通过直接的位运算进行这些与或非操作会大大地提高效率。

class bitmap
{

    char *buf;
public:
    int buf_len;//buf的长度
    int bit_len;//bitmap的位数
    bitmap(int *group,int group_len){
        bit_len=group_len;
        buf_len=group_len/8+1;
        buf=new char[buf_len];
        memset(buf,0,sizeof(char)*buf_len);
        int i;
        for(i=0;i<group_len;++i){
            if(group[i])
                set(i);
        }
    }
    ~bitmap(){
        delete []buf;
    }
    void set(int n);
    int get(int i);
    void set_and(const bitmap &m);
};

void bitmap::set(int n){
    int i=n/8;
    int offset=n%8;
    unsigned char mask=(0x80>>offset);
    buf[i]|=mask;
}

int bitmap::get(int i){
    int index=i/8;
    int offset=i%8;
    unsigned char mask=(0x80>>offset);
    if(buf[index] & mask)
        return 1;
    else
        return 0;
}

void bitmap::set_and(const bitmap &m){
    int i;
    for(i=0;i<buf_len;++i){
        buf[i]&=m.buf[i];//直接对8位的char按位与
    }
}

int  main()
{
    int g[10]={1,1,0,0,1,0,1,0,1,0};
    int z[10]={1,0,0,1,1,0,1,1,0,0};
    bitmap bg(g,10);
    bitmap bz(z,10);
    bg.set_and(bz);
    int i;
    for(i=0;i<10;++i){
        cout<<bg.get(i)<<" ";
    }
    cout<<endl;
    return 0;
}

 

posted @ 2013-09-11 11:08  iyjhabc  阅读(802)  评论(0编辑  收藏  举报