/* * ===================================================================================== * * 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 bitsint create_bitset(int length);void free_bitset();//return < 0, have error; =0 successful//@param nbit is bit index //@param value avalid 0 or 1int set_bitset(int nbit,int value);//return < 0 have error; =0 succesful//@param nbit is bit indexint 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 bitsetint main(){int n = 4125;create_bitset(n);int i = 0;for(; i < n; ++i){if(i%2 == 0)set_bitset(i,0);elseset_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;}