Commit | Line | Data |
---|---|---|
51aa2da8 JA |
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 | } | |
def823d4 JA |
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 | |
a240e441 JA |
26 | uint64_t res = w - ((w >> 1) & 0x5555555555555555ULL); |
27 | res = (res & 0x3333333333333333ULL) + ((res >> 2) & 0x3333333333333333ULL); | |
28 | res = (res + (res >> 4)) & 0x0F0F0F0F0F0F0F0FULL; | |
def823d4 JA |
29 | res = res + (res >> 8); |
30 | res = res + (res >> 16); | |
a240e441 | 31 | return (res + (res >> 32)) & 0x00000000000000FFULL; |
def823d4 JA |
32 | #endif |
33 | } |