bit_map

unsigned char flags[1000];

int  getv(int idx)
{
    int i=idx>>3;
    int j=idx&0x7;
    //return ((flags[i]&(0x1<<j))>>j);
    return ((flags[i]>>j)&0x01);
}

int setv(int idx)
{
    int i=idx>>3;
    int j=idx&0x07;
    flags[i]|=(0x01<<j);
}

unsigned get_val(int idx)
{
    int i = idx/4;
    int j = idx%4;
    unsigned ret = (flags[i]&(0x3<<(2*j)))>>(2*j);
    return ret;
}

unsigned set_val(int idx, unsigned int val)
{
    int i = idx/4;
    int j = idx%4;
    //unsigned tmp = (flags[i]&~((0x3<<(2*j))&0xff)) | (((val%4)<<(2*j))&0xff);
    flags[i] = (flags[i]&~(0x3<<(2*j)))|(val<<(2*j));
    return 0;
}


unsigned add_one(int idx)
{
    if (get_val(idx)>=2) {
        return 1;
    }
    else  {
        set_val(idx, get_val(idx)+1);
        return 0;
    }
}

int a[]={1, 3, 5, 7, 9, 1, 3, 5, 7, 1, 3, 5,1, 3, 1,10,2,4,6,8,0};

int main()
{
    int i,j;
    memset(flags, 0, sizeof(flags));
/*
    printf("原数组为:");
    for(i=0;i < sizeof(a)/sizeof(int); ++i)  {
        printf("%d  ", a[i]);
        add_one(a[i]);
    }
    printf("\r\n");
    printf("只出现过一次的数:");
    for(i=0;i < 100; ++i)  {
        if(get_val(i) == 1)
            printf("%d  ", i);
    }
*/
///*
    for(i=0;i<sizeof(a)/sizeof(int);++i){
        if(getv(a[i])==0)
            setv(a[i]);
        else
            ;
            //cout<<a[i]<<" ";
    }
//*/
    for(i=0;i<2;i++)
        for(j=0;j<8;j++){
            if((flags[i]>>j)&0x01==1)
                cout<<((i<<3)+j)<<" ";
        }

    printf("\r\n");
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值