位图操作在数据量很大时,标记某些数据出现与否很有用,能够很大程度上节俭内存所以用处很广。对于大部分人来说其概念已经很熟悉,所以在此不再多做解释。此篇博文主要是将位图操作的C与C++操作呈现给大家。C中位图没有自己定义的函数所以必须自己书写,但在C++中已经存在位图操作函数,所以我们在此只做介绍如何使用。
如有错误多谢大家指正
#define MAX 1000000
#define SHIFT 5
#define MASK 0x1F //
#define DIGITS 32
int a[1+MAX/DIGITS]; //申请的字节数
void set(int n) //将逻辑位置为n的二进制位置为1
{
a[n>>SHIFT]=a[n>>SHIFT]|(1<<(n&MASK)); //n>>SHIFT右移5位相当于除以32求算字节位置,n&MASK相当于对32取余即求位位置,
} //然后将1左移的结果与当前数组元素进行或操作,相当于将逻辑位置为n的二进制位置1.
void clear(int n)
{
a[n>>SHIFT]=a[n>>SHIFT]&(~(1<<(n&MASK))); //将逻辑位置为n的二进制位置0,原理同set操作
}
int test(int n)
{
return a[n>>SHIFT] & (1<<(n&MASK)); //测试逻辑位置为n的二进制位是否为1
}
C++
#include <iostream>
#include<bitset>
#define MAX 1000000
using namespace std;
bitset<MAX+1> bit; //声明一个有(MAX+1)个二进制位的bitset集合,初始默认所有二进制位为0
int main()
{
int n,i;
while(scanf("%d",&n)!=EOF)
{
bit.set(n,1); //将第n位置1
}
for(i=0;i<=MAX+1;i++)
{
if(bit[i]==1)
printf("%d ",i);
}
return 0;
}
如有错误多谢大家指正