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 | |
26 | uint64_t res = w - ((w >> 1) & 0x5555555555555555ul); | |
27 | res = (res & 0x3333333333333333ul) + ((res >> 2) & 0x3333333333333333ul); | |
28 | res = (res + (res >> 4)) & 0x0F0F0F0F0F0F0F0Ful; | |
29 | res = res + (res >> 8); | |
30 | res = res + (res >> 16); | |
31 | return (res + (res >> 32)) & 0x00000000000000FFul; | |
32 | #endif | |
33 | } |