Home | History | Annotate | Download | only in marisa_alpha
      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:
     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 
     19   UInt32 lo8() const {
     20     return value_ & 0xFFU;
     21   }
     22   UInt32 lo16() const {
     23     return (value_ >> 8) & 0xFFU;
     24   }
     25   UInt32 lo24() const {
     26     return (value_ >> 16) & 0xFFU;
     27   }
     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