#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<string.h>
typedef struct BitMap
{
size_t* _bits;//
size_t _range;//
}BitMap;
void BitMapInit(BitMap* bm, size_t range)
{
assert(bm);
bm->_range=range;
bm->_bits=(size_t*)malloc(sizeof(size_t)*(range/32+1));//malloc(sizeof(size_t)*(range/32+1))指的是开辟空间存放足够大的range个数的存在(1)或不存在(0)的状态
memset(bm->_bits,0,sizeof(size_t)*(range/32+1));
}
void BitMapSet(BitMap* bm, size_t x)//添加数字使其状态置为1
{
size_t index=x/32;//index指的是x的状态在第几个字节中
size_t num=x%32;//num指的是x的状态在某个字节中的第几个比特位
bm->_bits[index]|=(1<<num);//index字节中num位置状态置为1
}
void BitMapReset(BitMap* bm, size_t x)//判断数字是否存在
{
size_t index=x/32;
size_t num=x%32;
bm->_bits[index]&=(1<<num);
}
int BitMapTest(BitMap* bm, size_t x)
{// x存在返回0,不存在返回1
BitMapInit(bm, -1);
//BitMapSet(bm,x);
BitMapReset(bm,x);
if(bm->_bits[x/32]==0)
return 1;
else
return 0;
}
int main()
{
BitMap bm;
unsigned int n=1000000;
int ret=BitMapTest(&bm,n);
if(ret==1)
printf("[%u]->不存在\n",n);
else
printf("[%u]->存在",n);
return 0;
}哈希变形—位图(给定40亿个不重复的无符号数整数,没排过序,给一个无符号整数,如何快速判断一个数是否在这40亿个数中)
最新推荐文章于 2025-05-08 22:05:15 发布
本文介绍了一种位图数据结构的实现方法,并提供了初始化、设置和重置位图的操作示例。通过使用位图可以高效地管理和存储大量二进制数据。
547

被折叠的 条评论
为什么被折叠?



