Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/tools/perf/util/hweight.c
10821 views
1
#include <linux/bitops.h>
2
3
/**
4
* hweightN - returns the hamming weight of a N-bit word
5
* @x: the word to weigh
6
*
7
* The Hamming Weight of a number is the total number of bits set in it.
8
*/
9
10
unsigned int hweight32(unsigned int w)
11
{
12
unsigned int res = w - ((w >> 1) & 0x55555555);
13
res = (res & 0x33333333) + ((res >> 2) & 0x33333333);
14
res = (res + (res >> 4)) & 0x0F0F0F0F;
15
res = res + (res >> 8);
16
return (res + (res >> 16)) & 0x000000FF;
17
}
18
19
unsigned long hweight64(__u64 w)
20
{
21
#if BITS_PER_LONG == 32
22
return hweight32((unsigned int)(w >> 32)) + hweight32((unsigned int)w);
23
#elif BITS_PER_LONG == 64
24
__u64 res = w - ((w >> 1) & 0x5555555555555555ul);
25
res = (res & 0x3333333333333333ul) + ((res >> 2) & 0x3333333333333333ul);
26
res = (res + (res >> 4)) & 0x0F0F0F0F0F0F0F0Ful;
27
res = res + (res >> 8);
28
res = res + (res >> 16);
29
return (res + (res >> 32)) & 0x00000000000000FFul;
30
#endif
31
}
32
33