位图简单实现

/*
 * =====================================================================================
 *
 *       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);
	}
	
	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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值