数据结构之位图
位图是个很简单的东西,它通过利用一个bit位来表示一些数据状态简单的情况,比如一万个人的性别,
或者表示某些东西是否存在,在某些情况可以节省大量的空间。
这是位图的结构体代码,capacity表示要存储的数据数量:
#pragma once
#include<stdint.h>
#include<stddef.h>
typedef struct BitMap{
uint64_t* data;
size_t capacity;
}BitMap;
假设我需要存储65个数据,那么我需要两个uint64_t类型的数据
我就申请一段内存空间,这些都在初始化的过程中完成,代码如下:
size_t DataSize(size_t capacity) {
/*sizeof(uint64_t)是8个字节, capacity表示需要存储的数据类型*/
return capacity / (sizeof(uint64_t) * 8)+ 1;
}
/*初始化*/
void BitMapInit(BitMap* bm, size_t capacity) {
if (bm == NULL) {
return;
}
bm->capacity = capacity;
/*得到的size表示需要容量的几个64位的存储空间*/
size_t size = DataSize(capacity);
bm->data = (uint64_t*)malloc(sizeof(uint64_t)* size);
memset(bm->data, 0, sizeof(uint64_t)* size);
}
我申请了一段内存空间,然后把这段空间初始化为0
好了,如果我需要说明一个数据存在,比如65,我要把它存在的信息放入这个位图里面
先得出65要存储在数组中的哪一个元素的位中,代码如下:
size_t index = 65;
n = index / (sizeof(uint64_t)* 8);
n就是数组下标,然后再得出偏移量offset:</