1 #ifndef MARISA_ALPHA_POPCOUNT_H_
2 #define MARISA_ALPHA_POPCOUNT_H_
3 
4 #include "base.h"
5 
6 namespace marisa_alpha {
7 
8 class PopCount {
9  public:
PopCount(UInt32 x)10   PopCount(UInt32 x) : value_() {
11     x = (x & 0x55555555U) + ((x & 0xAAAAAAAAU) >> 1);
12     x = (x & 0x33333333U) + ((x & 0xCCCCCCCCU) >> 2);
13     x = (x + (x >> 4)) & 0x0F0F0F0FU;
14     x += x << 8;
15     x += x << 16;
16     value_ = x;
17   }
18 
lo8()19   UInt32 lo8() const {
20     return value_ & 0xFFU;
21   }
lo16()22   UInt32 lo16() const {
23     return (value_ >> 8) & 0xFFU;
24   }
lo24()25   UInt32 lo24() const {
26     return (value_ >> 16) & 0xFFU;
27   }
lo32()28   UInt32 lo32() const {
29     return value_ >> 24;
30   }
31 
32  private:
33   UInt32 value_;
34 };
35 
36 }  // namespace marisa_alpha
37 
38 #endif  // MARISA_ALPHA_POPCOUNT_H_
39