诉求:用最少的内存存储尽量大的bool型变量(0,1),使得数组的大小尽可能大,按位存储。
方法:
①定义一个大小为1000的unsigned char类型的数组(实际可以存储8000个元素):
unsigned char map[1000];
②数组元素赋值:例如将index为6222的元素由原来的0置为1
unsigned int index = 6222;
unsigned int map_index = (6222 >> 3) - 1; //一个unsigned char包含8个bit,因此先将index除以8,由于8是2的3次方,即右移3位
unsigned int offset = 6222 & (8 - 1); //取模,由于是2的次方,因此简化成 & (2^n -1)
map[map_index] |= (1 << offset) //用或的方式赋值
③使用:例如判断某一个index对应的值是否为true(即是否被置为1),假设已经用②的方法将index转换为map_index和offset
if (map[map_index] & (0x00 | (1 << offset))) {
// do something
}
说明:
- 适合大型数组去重输出等可能对性能要求比较高的场景;
- 对2的n次方取模运算