代码
#pragma once
#ifndef _BITMAP_H_
#define _BITMAP_H_
typedef unsigned long size_t;
typedef struct HashBitMap
{
size_t* _BitMap;
size_t _size;
size_t _capacity;
}BitMap,*pBitMap;
char* Num = "\0\1\1\2\1\2\2\3";
void InitBitMap(pBitMap bm, size_t size);
void InsertBitMap(pBitMap bm, size_t data);
int FindBitMap(pBitMap bm, size_t data);
void Set(pBitMap bm, int seat, int num);
void ReSet(pBitMap bm, int seat, int num);
size_t SizeBitMap(BitMap* bmp);
size_t CountBitMap(BitMap* bmp);
void DestroyBitMap(BitMap* bmp);
#endif//!_BITMAP_H_
#include"BitMap.h"
#include<stdlib.h>
#include<assert.h>
#include<stdio.h>
void InitBitMap(pBitMap bm, size_t size)
{
bm->_capacity = (size >> 5) + 1;
bm->_size = 0;
bm->_BitMap = (size_t*)malloc(sizeof(size_t) * bm->_capacity);
assert(bm->_BitMap);
for (int i = 0; i < bm->_capacity; i++)
bm->_BitMap[i] = 0;
}
void InsertBitMap(pBitMap bm, size_t data)
{
size_t Addr = data >> 5;
size_t bit = data % 32;
Set(bm, Addr, bit);
bm->_size++;
}
void Set(pBitMap bm, size_t Addr, size_t bit)
{
bm->_BitMap[Addr] |= 1 << bit;
}
void ReSet(pBitMap bm, size_t Addr, size_t bit)
{
bm->_BitMap[Addr] &= ~(1 << bit);
}
int FindBitMap(pBitMap bm, size_t data)
{
int Addr = data >> 5;
if (Addr >= bm->_capacity)
return 0;
int bit = data % 32;
return ((bm->_BitMap[Addr] & (1 << bit)) != 0);
}
size_t SizeBitMap(BitMap* bm)
{
assert(bm);
return bm->_size;
}
size_t CountBitMap(BitMap* bm)
{
assert(bm);
char* Bit4 = NULL;
size_t count = 0;
for (size_t i = 0; i < bm->_capacity; i++)
{
Bit4 = (char*)&bm->_BitMap[i];
int j = 0;
while (j < 4)
{
size_t num = *Bit4 & 7;
count += Num[num];
num = *Bit4 >> 4;
count += Num[num];
Bit4 ++;
j++;
}
}
return count;
}
void DestroyBitMap(BitMap* bm)
{
assert(bm);
free(bm->_BitMap);
bm->_size = 0;
bm->_capacity = 0;
}
void test()
{
BitMap bm;
InitBitMap(&bm, 100);
InsertBitMap(&bm, 86);
InsertBitMap(&bm, 13);
InsertBitMap(&bm, 84);
InsertBitMap(&bm, 56);
InsertBitMap(&bm, 20);
if (1 == FindBitMap(&bm, 86))
printf("%d Is In BitMap!!\n", 86);
else printf("%d Is Not In BitMap!!\n",86);
if (1 == FindBitMap(&bm, 20))
printf("%d Is In BitMap!!\n", 20);
else printf("%d Is Not In BitMap!!\n",20);
if (1 == FindBitMap(&bm, 56))
printf("%d Is In BitMap!!\n", 86);
else printf("%d Is Not In BitMap!!\n", 86);
if (1 == FindBitMap(&bm, 84))
printf("%d Is In BitMap!!\n", 86);
else printf("%d Is Not In BitMap!!\n", 86);
if (1 == FindBitMap(&bm, 13))
printf("%d Is In BitMap!!\n", 86);
else printf("%d Is Not In BitMap!!\n", 86);
size_t count = CountBitMap(&bm);
printf("count: %ld\n", count);
}
int main()
{
test();
system("pause");
return 0;
}