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;
}
输出结果验证: