位图相关代码实现

 

 bitmap.h

pragma once 

#include <stddef.h>

#include<inttypes.h>



typedef struct BitMap 

{ 

    uint64_t* data; 

    size_t capacity; // max bit 



} BitMap; 



void BitMapInit(BitMap* bm, size_t capacity); 



// 把第 index 位置为1 

void BitMapSet(BitMap* bm, size_t index); 



// 把第 index 位置为0 

void BitMapUnset(BitMap* bm, size_t index); 



// 测试 index 为是 1 , 还是 0. 如果是1, 就返回1. 否则返回0. 

int BitMapTest(BitMap* bm, size_t index); 



// 把整个位图所有的位都设为1. 

void BitMapFill(BitMap* bm); 



// 把整个位图所有的位都设为0. 

void BitMapClear(BitMap* bm); 



void BitMapDestroy(BitMap* bm);

bitmap.c

#include<stdio.h>

#include<stdlib.h>

#include"bitmap.h"



#define TEST_HEADER printf("\n=================%s===============\n", __FUNCTION__)



void BitMapInit(BitMap* bm, size_t capacity)

{



    if(bm==NULL)

    {

        return;

    }

  

    size_t tmp = capacity % 64;

    

    if(tmp==0)

    {

      bm->data=(uint64_t*)malloc( sizeof(uint64_t) * (capacity / 64)  );

      bm->capacity =capacity ;

    }

    else

    {

      bm->data=(uint64_t*)malloc( sizeof(uint64_t) * ( 1 + (capacity / 64) ) );

      bm->capacity = (1 + (capacity / 64))*64 ; 

    }





}



// 把第 index 位置为1 

void BitMapSet(BitMap* bm, size_t index)

{



    if(bm==NULL)

    {

        return;

    }

    

    if(bm->capacity<= index)

    {

        return;

    }



    size_t subscript=  index / 64;



    size_t offset = index % 64;



    // 0000 0000   0000 0000   0000 0000  0000 0000   0000 0000  0000 0000   0000 0000  0000 0001

    bm->data[subscript] |=  (uint64_t) 1 << offset;



}

//  [00000000]64  [000000000]64

// 把第 index 位置为0 

void BitMapUnset(BitMap* bm, size_t index)

{

  if(bm==NULL)

  {

      return;

  }

  if(bm->capacity <= index)

  {

    return;

  }



   uint64_t tmp=0xffffffffffffffff;

   

   size_t subscript = index/64;

   size_t offset = index % 64;



   tmp ^= (uint64_t)1<<offset;



   bm->data[subscript] &= tmp;





}



// 测试 index 为是 1 , 还是 0. 如果是1, 就返回1. 否则返回0. 



int BitMapTest(BitMap* bm, size_t index)

{

    if(bm==NULL)

    {

        return -1;

    }



    if(bm->capacity<= index)

    {

        return -2;

    }



   size_t subscript= index/64;

   size_t offset = index % 64;

    return ( 1 & (bm->data[subscript] >>offset));

   



    





}



// 把整个位图所有的位都设为1. 

void BitMapFill(BitMap* bm)

{



  if(bm==NULL)

  {

      return;

  }



  size_t i;

  size_t max= bm->capacity/64; 



  for(i=0;i<max;i++)

  {

    bm->data[i]=0xffffffffffffffff;

  }

   



}



// 把整个位图所有的位都设为0. 

void BitMapClear(BitMap* bm)

{

   if(bm==NULL)

   {

       return;

   }



  size_t i;

  size_t max= bm->capacity/64; 

  

  for(i=0;i<max;i++)

  {

    bm->data[i]=0;

  }



}



void BitMapDestroy(BitMap* bm)

{

    if(bm==NULL)

    {

        return;

    }

     

    free(bm->data);

    bm->data=NULL;



    bm->capacity=0;



}



void ShowSturct(BitMap* bm)

{

     printf("     Bit Map Sturct     \n");

     printf("data     : %10p\n",bm->data);

     printf("capacity : %10lu\n",bm->capacity);

}





void ShowBit(BitMap * bm)

{

   if(bm==NULL)

   {

       return;

   }

   printf("==================================================================================\n");

    size_t i;

    for(i=0;i< (bm->capacity/64);i++)

    {

      uint64_t tmp= bm->data[i]; 

       size_t t;

       for(t=0;t<64;t++)

       {

         if( tmp  & (uint64_t)1<<t )

         {

             printf("1 ");

         }

         else

         {

             printf("0 ");

         }

       }

      printf("\n");

    }

    printf("===========================================================================\n");

}



void TestAll()

{

    

    TEST_HEADER;

    BitMap bm;

    BitMapInit(&bm,1024);    

    ShowSturct(&bm);



    BitMapClear(&bm);

    ShowBit(&bm);



    BitMapSet(&bm, 1000); 

    BitMapSet(&bm, 1001); 

    BitMapSet(&bm, 1002); 

    BitMapSet(&bm, 1003); 

    BitMapSet(&bm, 1004); 

    BitMapSet(&bm, 1005); 

    ShowBit(&bm);



    int ret= BitMapTest(&bm,1000);



    printf("ret(1000) ----- expect 1 , actull:%d\n", ret);



   



    BitMapUnset(&bm, 1000);

    BitMapUnset(&bm, 1001);

//    BitMapUnset(&bm, 1002);

 //   BitMapUnset(&bm, 1003);

  //  BitMapUnset(&bm, 1004);

    ShowBit(&bm);

    ret=BitMapTest(&bm,1000);

    printf("ret(1000) ----- expect 0 , actull:%d\n", ret);



    BitMapFill(&bm);

    ShowBit(&bm);

    

    BitMapDestroy(&bm);

    ShowSturct(&bm);



}





int main()

{

  TestAll();

  return 0;

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值