位图算法的应用

2017-09-08  本文已影响0人  Joe_HUST

位图或位向量图作为一个集合,表示的这样的一个数据结构:用字符串 0 1 1 1 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 表示集合 {1,2,3,5,8,13}.

如给定表示文件中整数集合的位图数据结构,则可以分为三个阶段来编写程序:

字节位置=数据/32;(采用位运算即为右移5位)
位位置=数据%32;(采用位运算即跟0X1F进行与操作,因为0X1F=00011111,将一个数和0X1F相与就是将32的倍数全部清零,只留下余数位。)

#define MAX 10000000
#define SHIFT 5
#define MASK 0x1F
#define DIGITS 32

int a[1+MAX/DIGITS];

void set(int n)
{
    a[n>>SHIFT] |= (1<<(n&MASK));
//将1左移余数个位数即为将这个位置置1,即若将1左移6位则为将第六个bit位置1.其余全为0.
}

void clear(int n)
{
    a[n>>SHIFT] &= (~(1<<n&MASK));
//将1左移余数个位数即为将这个位置置1,再取反则为将这个bit置0,其余全为1.
}

int test(int n)
{
    return a[n>>SHIFT] &(1<<(n&MASK));
}

int main(int argc, char const *argv[])
{
    int i,n;
    for (i = 1; i <= MAX; ++i)
        clear(i);
    while(scanf("%d",&n)!=EOF)
        set(n);
    for(i=1;i<=MAX;i++)
        if (test(i))
            printf("%d\n",i);
    return 0;
}

上一篇 下一篇

猜你喜欢

热点阅读