【数据结构】数据结构之位图

数据结构之位图


位图是个很简单的东西,它通过利用一个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:</
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值