데이터 구조의 해시 변형 (비트 맵)
#pragma once
#include
#include
#include
#include
typedef uint64_t BitmapType;
typedef struct Bitmap
{
BitmapType* data;
uint64_t* capacity;
}Bitmap;
void BitmapInit(Bitmap* bm,uint64_t capacity);
void BitmapDestroy(Bitmap* bm);
void BitmapSet(Bitmap* bm,uint64_t index);
void BitmapUnSet(Bitmap* bm,uint64_t index);
void BitmapFill(Bitmap* bm,uint64_t capacity);
void BitmapClear(Bitmap* bm,uint64_t capacity);
uint64_t BitmapTest(Bitmap*bm,uint64_t index);
Bitmap.c
#include
#include "Bitmap.h"
void BitmapInit(Bitmap* bm,uint64_t capacity)
{
if(bm == NULL)
{
return;
}
bm->capacity = capacity;
uint64_t size = capacity/(sizeof(BitmapType)*8)+1;
bm->data = (BitmapType*)malloc(sizeof(BitmapType)*size);
memset(bm->data,0,sizeof(BitmapType)*size);
return;
}
void BitmapDestroy(Bitmap* bm)
{
if(bm == NULL)
{
return;
}
bm->capacity = 0;
free(bm->data);
return;
}
/*uint64_t Getsize(uint64_t capacity)
{
uint64_t size = capacity/(sizeof(BitmapType)*8);
}*/
uint64_t BitmapTest(Bitmap* bm,uint64_t index)
{
if(bm == NULL || index >= bm->capacity)
{
return;
}
uint64_t n,offset;
n = index/(sizeof(BitmapType)*8);
offset = index % (sizeof(BitmapType)*8);
uint64_t ret = bm->data[n]&(0x1ul << offset);
return ret > 0 ? 1 : 0 ;
}
/*void GetOffset(uint64_t index,uint64_t n,uint64_t offset)
{
*n = index/(sizeof(BitmapType)*8);
*offset = index % (sizeof(BitmapType)*8);
}*/
void BitmapSet(Bitmap* bm,uint64_t index)
{
if(bm == NULL || index >= bm->capacity)
{
return;
}
uint64_t n,offset;
n = index/(sizeof(BitmapType)*8);
offset = index % (sizeof(BitmapType)*8);
bm->data[n] = (0x1ul << offset);
return;
}
void BitmapUnSet(Bitmap* bm,u_int64_t index)
{
if(bm == NULL || index >= bm->capacity)
{
return;
}
uint64_t n,offset;
n = index/(sizeof(BitmapType)*8);
offset = index % (sizeof(BitmapType)*8);
bm->data[n] &= ~(0x1ul << offset);
}
void BitmapFill(Bitmap* bm,uint64_t capacity)
{
if(bm == NULL)
{
return;
}
uint64_t size = capacity/(sizeof(BitmapType)*8)+1;
memset(bm->data,0xff,sizeof(BitmapType)*size);
return;
}
void BitmapClear(Bitmap* bm,uint64_t capacity)
{
if(bm == NULL)
{
return;
}
uint64_t size = capacity/(sizeof(BitmapType)*8)+1;
memset(bm->data,0x0,sizeof(BitmapType)*size);
}
//----------------------test.c------------------------------
#define HEADER printf("
===============%s==============
",__FUNCTION__)
void test_BitmapTest()
{
HEADER;
Bitmap bm;
BitmapInit(&bm,100);
BitmapSet(&bm,50);
int ret = BitmapTest(&bm,50);
printf("ret expected 1,actual %d
",ret);
}
void test_BitmapUnSet()
{
HEADER;
Bitmap bm;
BitmapInit(&bm,100);
BitmapSet(&bm,50);
int ret1 = BitmapTest(&bm,50);
printf("ret1 expected 1,actual %d
",ret1);
BitmapUnSet(&bm,50);
int ret2 = BitmapTest(&bm,50);
printf("ret2 expected 0,actual %d
",ret2);
}
void test_BitmapFill()
{
HEADER;
Bitmap bm;
BitmapInit(&bm,100);
BitmapFill(&bm,100);
int ret1 = BitmapTest(&bm,50);
printf("ret1 expected 1,actual %d
",ret1);
int ret2 = BitmapTest(&bm,99);
printf("ret2 expected 1,actual %d
",ret2);
}
void test_BitmapClear()
{
HEADER;
Bitmap bm;
BitmapInit(&bm,100);
BitmapClear(&bm,100);
int ret1 = BitmapTest(&bm,50);
printf("ret1 expected 0,actual %d
",ret1);
int ret2 = BitmapTest(&bm,99);
printf("ret2 expected 0,actual %d
",ret2);
}
int main()
{
test_BitmapTest();
test_BitmapUnSet();
test_BitmapFill();
test_BitmapClear();
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
정수 반전Udemy 에서 공부 한 것을 중얼거린다 Chapter3【Integer Reversal】 (예) 문자열로 숫자를 반전 (toString, split, reverse, join) 인수의 수치 (n)가 0보다 위 또는 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.