/* */ #ifndef _D_BITFIELD_H_ #define _D_BITFIELD_H_ #include "common.h" #include #include #include "Util.h" namespace aria2 { namespace bitfield { // Returns the bit mask for the last byte. For example, nbits = 9, // then 0x80 is returned. nbits = 12, then 0xf0 is returned. inline unsigned char lastByteMask(size_t nbits) { return -256 >> (8-((nbits+7)/8*8-nbits)); } // Returns true if index-th bits is set. Otherwise returns false. inline bool test(const unsigned char* bitfield, size_t nbits, size_t index) { assert(index < nbits); unsigned char mask = 128 >> (index%8); return (bitfield[index/8]&mask) != 0; } inline size_t countBit32(uint32_t n) { static const int nbits[] = { 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8, }; return nbits[n&0xffu]+ nbits[(n >> 8)&0xffu]+ nbits[(n >> 16)&0xffu]+ nbits[(n >> 24)&0xffu]; } // Counts set bit in bitfield. inline size_t countSetBit(const unsigned char* bitfield, size_t nbits) { size_t count = 0; size_t size = sizeof(uint32_t); size_t len = (nbits+7)/8; size_t to = len/size; for(size_t i = 0; i < to; ++i) { count += countBit32(*reinterpret_cast(&bitfield[i*size])); } for(size_t i = len-len%size; i < len-1; ++i) { count += countBit32(static_cast(bitfield[i])); } if(nbits%32 != 0) { count += countBit32(static_cast(bitfield[len-1]&lastByteMask(nbits))); } return count; } } // namespace bitfield } // namespace aria2 #endif // _D_BITFIELD_H_