#ifndef _H_BITFIELD #define _H_BITFIELD #include #include #include "_stdint.h" typedef unsigned char bitfield_t; extern inline bitfield_t * bitfield_calloc(int size) { return calloc(1, 1 + ((size_t)size / 8)); } extern inline int change_bit(bitfield_t *addr, int nr, int wh) { int mask, retval; addr += nr >> 3; mask = 1 << (nr & 0x7); retval = (mask & *addr) != 0; if(wh) *addr |= mask; else *addr &= ~mask; return retval; } extern inline int set_bit(bitfield_t * addr, int nr) { int mask, retval; addr += nr >> 3; mask = 1 << (nr & 0x7); retval = (mask & *addr) != 0; *addr |= mask; return retval; } extern inline int clear_bit(bitfield_t * addr, int nr) { int mask, retval; addr += nr >> 3; mask = 1 << (nr & 0x7); retval = (mask & *addr) != 0; *addr &= ~mask; return retval; } extern inline int test_bit(bitfield_t * addr, int nr) { int mask; addr += nr >> 3; mask = 1 << (nr & 0x7); return ((mask & *addr) != 0); } extern inline void bitfield_clear(bitfield_t * addr, int nr) { memset(addr, 0, 1 + (nr / 8)); } extern inline uint32_t bit_count(uint32_t x) { x -= (x>>1) & 0x55555555; x = ((x>>2) & 0x33333333) + (x & 0x33333333); x = ((x>>4) + x) & 0x0f0f0f0f; x *= 0x01010101; return x>>24; } #endif