Home | History | Annotate | Download | only in lib
      1 #include "hweight.h"
      2 
      3 unsigned int hweight8(uint8_t w)
      4 {
      5 	unsigned int res = w - ((w >> 1) & 0x55);
      6 
      7 	res = (res & 0x33) + ((res >> 2) & 0x33);
      8 	return (res + (res >> 4)) & 0x0F;
      9 }
     10 
     11 unsigned int hweight32(uint32_t w)
     12 {
     13 	unsigned int res = w - ((w >> 1) & 0x55555555);
     14 
     15 	res = (res & 0x33333333) + ((res >> 2) & 0x33333333);
     16 	res = (res + (res >> 4)) & 0x0F0F0F0F;
     17 	res = res + (res >> 8);
     18 	return (res + (res >> 16)) & 0x000000FF;
     19 }
     20 
     21 unsigned int hweight64(uint64_t w)
     22 {
     23 #if BITS_PER_LONG == 32
     24 	return hweight32((unsigned int)(w >> 32)) + hweight32((unsigned int)w);
     25 #else
     26 	uint64_t res = w - ((w >> 1) & 0x5555555555555555ULL);
     27 	res = (res & 0x3333333333333333ULL) + ((res >> 2) & 0x3333333333333333ULL);
     28 	res = (res + (res >> 4)) & 0x0F0F0F0F0F0F0F0FULL;
     29 	res = res + (res >> 8);
     30 	res = res + (res >> 16);
     31 	return (res + (res >> 32)) & 0x00000000000000FFULL;
     32 #endif
     33 }
     34