1 unsigned popcount_64(uint64_t x)
2 {
3 static const uint64_t m1 = 0x5555555555555555LLU;
4 static const uint64_t m2 = 0x3333333333333333LLU;
5 static const uint64_t m4 = 0x0f0f0f0f0f0f0f0fLLU;
6 static const uint64_t h01 = 0x0101010101010101LLU;
7
8 x -= (x >> 1) & m1;
9 x = (x & m2) + ((x >> 2) & m2);
10 x = (x + (x >> 4)) & m4;
11 return (x * h01) >> 56;
12 }
13 EXPORT_SYMBOL(popcount64);
14
15 unsigned popcount_32(uint32_t x)
16 {
17 static const uint32_t m1 = 0x55555555;
18 static const uint32_t m2 = 0x33333333;
19 static const uint32_t m4 = 0x0f0f0f0f;
20 static const uint32_t h01 = 0x01010101;
21
22 x -= (x >> 1) & m1;
23 x = (x & m2) + ((x >> 2) & m2);
24 x = (x + (x >> 4)) & m4;
25 return (x * h01) >> 24;
26 }
27 EXPORT_SYMBOL(popcount32);
BcacheWiki: Popcount (last edited 2011-09-15 23:50:09 by Kent)