BitMap算法

BitMap算法

程序详细说明:

C++语言中,char,1字节,8位,二进制 0000 0000

所以,如果有10个数,需要存储,需要 new char[10/8+1],就是2个char,也就是16位二进制 0000 0000 0000 0000

(此顺序类比 int arr[3] = {1,2,3}, arr[0] = 1,以下顺序,均为从左到右,没有按照上图的标准顺序)!!!

1-》 输入7,则byteIndex = 7/8 = 0,先定位到char[0],也就是上面红色的8个0,

再定位偏移 bitIndex = 7%8 = 7, 在char[0]中  从左往右 偏移7位,把0置1,红色区变为:0000 0001

此时,char[] 数组,就变为  0000 0001 0000 0000

2-》 输入9,则byteIndex = 9/8 = 1,先定位到char[1],也就是上面绿色的8个0,

再定位偏移 bitIndex = 9%8 = 1, 在char[1]中  从左往右 偏移1位,把0置1,绿色区变为:0100 0000

此时,char[] 数组,就变为  0000 0001 0100 0000

3-》 以上打印输出顺序,是从0-15打印输出。如果15-0打印输出,则符合 低位在右 高位在左 的习惯。

4-》 判断7是否存在,

/*
* 位图:用于减少内存的算法。
*/
#include <iostream>
using namespace std;

class BitMap
{
public:
    char* bytes;        // 字节,8位
    int nbits;            // 需要对比的数字
    // 构造
    BitMap(int n):nbits(n)
    {
        bytes = new char[nbits/8 + 1]();
    }
    // 析构
    ~BitMap()
    {
        delete []bytes;
    }
    // 设置k存储
    void set(int k)
    {
        if (k > nbits)
        {
            return;
        }
        int byteIndex = k / 8;        // 决定放在第几位,
        int bitIndex = k % 8;        // 决定左移几位
        // |=  表示按位或 后 赋值。 1 << bitIndex :1为二进制,1,左移bitIndex(3)位,就是二进制(1000),即十进制的8
        bytes[byteIndex] |= (1 << bitIndex);        // 位移操作 。
    }
    // 判断k是否在BitMap中
    bool get(int k)
    {
        if (k > nbits)
        {
            return false;
        }
        int byteIndex = k / 8;        // 决定放在第几位,
        int bitIndex = k % 8;        // 决定左移几位
        return (bytes[byteIndex] & (1 << bitIndex)) != 0;        // 按位与,即
    }
    
    void print()
	{
		int size = (nbits / 8 + 1) * 8;
		cout << "0-15输出:" << endl;
		for (int i = 0; i < size; ++i)
		{
			cout << get(i) << " ";
		}
 		cout << endl;
		cout << "15-0输出:" << endl;
		for (int i = size - 1; i >= 0; --i)
		{
			cout << get(i) << " ";
		}
		cout << endl;
	}
};

int main()
{
    BitMap bm(10);
    for (int i = 1; i < 10; ++i)
    {
        bm.set(i);        // 当i为8.9时,bytes[i] 的值为-2,感觉有问题。
    }
    cout << bm.get(5) << endl;
    cout << bm.get(6) << endl;
    cout << bm.get(7) << endl;
    print();
    system("pause");
    return 0;
}

输出结果验证:

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值