c++ 简单实现bit-map

这里主要写代码,具体原理可以查看https://blog.csdn.net/weixin_40449300/article/details/87620692

bit-map使用更少的空间,实现排序、去重

假设我们有a数组,里面存放1, 7, 9, 10, 30, 31, 32, 128, 129 这9个数字。由于这9个数字最大为129,我们可以用b[5](129/32=4,4+1=5)数组来表示这9个数字。

赋值

a[i] & 31表示a[i] % 32,对其求余;a[i] >> 5 表示 a[i]  / 32

    int a[] = {1, 7, 9, 10, 30, 31, 32, 128, 129};
    int b[5];
    memset(b, 0, sizeof(b));
    for (int i = 0; i < sizeof(a) / 4; i++)
    {
        int pos2 = a[i] & 31;
        b[a[i] >> 5] |= 1 << (a[i] & 31);
    }
    

遍历

这里有两种方法,查找也可以根据以下代码改,执行以下代码将输出“1 7 9 10 30 31 32 128 129”,也就是a数组的内容。去重可以使用两个数组,根据判断条件实现

    //方法一
    for (int i = 0; i < 130; i++)
    {
        if (b[i >> 5] & (1 << (i & 31)))
            cout << i << " ";
    }

    
    //方法二
    for (int i = 0; i < sizeof(b) / 4; i++)
    {
        if (b[i] != 0)
        {
            for (int j = 0; j < 32; j++)
            {
                if (b[i] & (1 << j))
                    cout << ((i << 5) + j) << " ";
            }
        }
    }

 

你可能感兴趣的:(C++)