C与C++分别实现位图操作

位图操作在数据量很大时,标记某些数据出现与否很有用,能够很大程度上节俭内存所以用处很广。对于大部分人来说其概念已经很熟悉,所以在此不再多做解释。此篇博文主要是将位图操作的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;
}

如有错误多谢大家指正


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值