位图
用来快速判断一个整数是否在一堆整数中
二进制用0和1来表示数据,位图根据0和1来存储对应的数据,可以大大节省存储空间,并具备排序特性。
例如数组:int arr[ ] = {1,31,53,41,79,201}
创建字符数组 int bitmap[26]
(因为数字最大数201,26 * 8=208 < 201)
遍历字符数组的每一位,设置 0 或者 1
通过设置 0 或者 1 来判断这个值是否存在。1表示存在
比如:31
因为(3*8 + 7 = 31)
则需要对 bitmap[3]
的第 7 位设置为 1
位图的基本操作
/*================================================================
# File Name: bitmap.h
# Author: rjm
# mail: rjm96@foxmail.com
# Created Time: 2018年05月22日 星期二 16时30分58秒
================================================================*/
#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <inttypes.h>
#include <string.h>
#define TEST_HEAD printf("\n=======================%s==================\n",
__FUNCTION__)
typedef uint64_t BitmapType;
typedef struct Bitmap {
BitmapType* data; // 数组
uint64_t capacity; // 需要表示的位数
// 例如:要表示100位
// 需要的数组元素个数为
// (100 / (sizeof(uint64_t)*8)) + 1
// 即为 2 个元素
} Bitmap;
// 初始化
void BitmapInit(Bitmap* bm, uint64_t bits);
// 给某一位设置为 1
void BitmapSet(Bitmap* bm, uint64_t bits);
// 给某一位设置为 1
void BitmapUnset(Bitmap* bm, uint64_t bits);
// 给所有位设置为 1
void BitmapAllSet(Bitmap* bm);
// 给所有位设置为 0
void BitmapAllUnset(Bitmap* bm);
// 测试某一位是否为 1
uint64_t BitmapTest(Bitmap* bm, uint64_t bits);
// 销毁
void BitmapDestroy(Bitmap* bm);
/*================================================================
# File Name: bitmap.c
# Author: rjm
# mail: rjm96@foxmail.com
# Created Time: 2018年05月22日 星期二 16时30分48秒
================================================================*/
#include "bitmap.h"
uint64_t DataSize(uint64_t capacity)
{
return capacity / (sizeof(BitmapType)*8) + 1;
}
// 初始化
void BitmapInit(Bitmap* bm, uin