当前位置:编程学习 > C/C++ >>

位图简单实现

c
[cpp]  
/* 
 * ===================================================================================== 
 * 
 *       Filename:  bitset.c 
 * 
 *    Description:   
 * 
 *        Version:  1.0 
 *        Created:  02/04/2013 10:25:38 AM 
 *       Revision:  none 
 *       Compiler:  gcc 
 * 
 *         Author:  jiangwenlong (http://blog.csdn.net/chlaws), jiangwenlong@pipi.cn 
 *        Company:  PIPI 
 * 
 * ===================================================================================== 
 */  
#include <stdio.h>  
#include <stdlib.h>  
#include <string.h>  
//find index of array  
#define BIT_WORD(n) ((n)/32)  
//get number of bit value  
#define BIT_MASK(n) (1<<((n)%32))  
static int bit_size = 0;  
#define uint unsigned int   
static uint *bitset = NULL;  
  
//return <0, have error; =0 successful  
//@param length is bitset have length bits  
int create_bitset(int length);  
  
void free_bitset();  
  
//return < 0, have error; =0 successful  
//@param nbit is bit index   
//@param value avalid 0 or 1  
int set_bitset(int nbit,int value);  
  
//return < 0 have error; =0 succesful  
//@param nbit is bit index  
int get_bitset(int nbit);  
  
int create_bitset(int length)  
{  
    int nword = BIT_WORD(length);  
    int need_len = (nword+1)* sizeof(uint);  
    bitset = (uint*)malloc(need_len);  
    if(bitset == NULL) return -1;  
    memset(bitset,0,need_len);  
    bit_size = need_len * 8;  
    return 0;  
}  
  
void free_bitset()  
{  
    free(bitset);  
}  
  
int set_bitset(int nbit,int value)  
{  
    if(nbit < 0 || nbit > bit_size) return -1;  
    if(bitset == NULL) return -2;  
    if(value != 0 && value != 1) return -3;  
      
    int index = BIT_WORD(nbit);  
    if(value == 1)  
        bitset[index] |= BIT_MASK(nbit);  
    else{  
        bitset[index] &= ~BIT_MASK(nbit);  
    }  
    return 0;  
}  
  
int get_bitset(int nbit)  
{  
    if(nbit < 0 || nbit > bit_size) return -1;  
    if(bitset == NULL) return -2;  
      
    int index = BIT_WORD(nbit);  
    return (bitset[index] & BIT_MASK(nbit)) >> (nbit%32);   
}  
  
//test bitset  
int main()  
{     
    int n = 4125;  
    create_bitset(n);  
    int i = 0;  
    for(; i < n; ++i){  
        if(i%2 == 0)  
            set_bitset(i,0);  
        else  
            set_bitset(i,1);  
    }   www.zzzyk.com
      
    for(i = 0; i < n; ++i){  
        printf("bit[%d]=%d ",i,get_bitset(i));  
        if(i > 0 && i % 10 == 0) printf("\n");  
    }  
    printf("\n");  
    free_bitset();  
      
    return 0;  
}  
 
补充:软件开发 , C++ ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,