[算法]使用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; }