在以下情况下实现位图

时间:2013-06-15 05:59:50

标签: c bitmap

我的问题是如何在以下情况下实现位图? 如果图的顶点在最小生成树(MST)中,则标记相应的位;稍后通过检查位来检查它是否在MST中。

一开始,我正在考虑使用

typedef struct bit_t{    
   char bit0:1;
} bit;       

bit bitmap[num_of_vertex];     

使用位图数组记录该位;

但后来我发现sizeof(位图[num_of_vertex])是num_of_vertex字节,而不是num_of_vertex / 8字节。所以它不像我想的那样节省空间;

到目前为止,我使用

long bit_record = 0;   
...
bit_record |= 1<< u;//set vertex as in MST    
...    

然后再检查顶点是否在MST中使用:

static bool is_in_MST(int v, int bit_record){   
    int mask = 1 <<  v;   
    if (mask & bit_record)    
        return true;   
    else    
        return false;   
}      

尽管代码有效,但如果num_of_vertex大于32,它将无效。

如何实现上述情况中的位图?

2 个答案:

答案 0 :(得分:5)

情况是你只是在C中不能有1位类型。最小可寻址单位是C中的一个字节,所以即使你声明一个具有一位位字节的结构,它将被填充到一个字节(至少)。你可以做的是创建一个字节数组,然后使用除法和模数访问数组中的位。

unsigned char bitmap[0x100] = { 0 };

void set_nth_bit(unsigned char *bitmap, int idx)
{
    bitmap[idx / CHAR_BIT] |= 1 << (idx % CHAR_BIT);
}

void clear_nth_bit(unsigned char *bitmap, int idx)
{
    bitmap[idx / CHAR_BIT] &= ~(1 << (idx % CHAR_BIT));
}

int get_nth_bit(unsigned char *bitmap, int idx)
{
    return (bitmap[idx / CHAR_BIT] >> (idx % CHAR_BIT)) & 1;
}

答案 1 :(得分:1)

关于位图,这是一个关于Programming Pearls的例子,我添加了一些注意事项:

#define BITPERWORD  32 //bits of int,which depends on your computer
#define N           10000000 // number of your elements
#define SHIFT       5 // 32 = 2^5
#define MASK        0x1F // 11111 in binary 
int a[N/BITPERWORD + 1]; //space for your bitmap

// i is the the bit you want to use
void set(int i)     {        a[i>>SHIFT] |=  (1<<(i&MASK));}
void clr(int i)     {        a[i>>SHIFT] &= ~(1<<(i&MASK));}
int  test(int i)    { return a[i>>SHIFT] &   (1<<(i&MASK));}

并且不要忘记开头的初始化:

for(i=0;i<N;i++)
    clr(i);