无符号整数的bitmap

#include <iostream>
#include <memory.h>
#include <memory>
using namespace std;

/*
 * // 0000 0000 八个bit位,每一位标志一个数是否存在
 *   unsigned char bit_table[8]{1, 2, 4, 8, 16, 32, 64, 128};
 *
 *    unsigned char c = 0;
 *   c |= bit_table[3];  // c的第3(右7<-左0)bit为置为1,用以标志3的存在
 */



namespace yudw
{
    class unsigned_int_bitmap
    {

    public:
        unsigned_int_bitmap()
        {
            const unsigned int max_unsigned_int = 0xffffffff;
            const unsigned int n_map_size = max_unsigned_int / 8 + (max_unsigned_int % 8 == 0 ? 0 : 1);

            bit_map = new char[n_map_size];
            memset(bit_map, 0, n_map_size);
        }
        ~unsigned_int_bitmap(){delete[] bit_map; }

        void store(unsigned int num)
        {
            unsigned int bit_map_index = num / 8;
            unsigned int bit_index = num % 8;

            bit_map[bit_map_index] |= bit_table[bit_index];     // bit位置1次数标志存在
        }

        bool load(unsigned int num)
        {

            unsigned int bit_map_index = num / 8;
            unsigned int bit_index = num % 8;

            return bit_map[bit_map_index] & bit_table[bit_index];  // 我们只需要看一下对应的bit位有没有被置1
        }

    private:
        char* bit_map;   //每一个bit_map元素可以用它的8bit位标记8个数字是否存在
        unsigned char bit_table[8]{1, 2, 4, 8, 16, 32, 64, 128};    // 一个数num |= bit_table[i], 则第ibit(7<-0)为被置为1
    };
}



int main()
{


    unsigned int  a[]{1, 23, 43, 34, 5, 22, 54, 92, 908, 888888};

    unsigned int b[]{1, 23, 43, 34, 5, 22, 54, 92, 908, 22222};

    yudw::unsigned_int_bitmap bitmap;
    for(int i =0; i < 10; ++i)
    {
        bitmap.store(a[i]);
    }

    for(int i=0; i < 10; ++i)
    {
        cout<<bitmap.load(b[i])<<' ';
    }

    return 0;
}
运行结果:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值