| #ifndef MARISA_POPCOUNT_H_ |
| #define MARISA_POPCOUNT_H_ |
| |
| #include "base.h" |
| |
| namespace marisa { |
| |
| class PopCount { |
| public: |
| PopCount(UInt32 x) : value_() { |
| x = (x & 0x55555555U) + ((x & 0xAAAAAAAAU) >> 1); |
| x = (x & 0x33333333U) + ((x & 0xCCCCCCCCU) >> 2); |
| x = (x + (x >> 4)) & 0x0F0F0F0FU; |
| x += x << 8; |
| x += x << 16; |
| value_ = x; |
| } |
| |
| UInt32 lo8() const { |
| return value_ & 0xFFU; |
| } |
| UInt32 lo16() const { |
| return (value_ >> 8) & 0xFFU; |
| } |
| UInt32 lo24() const { |
| return (value_ >> 16) & 0xFFU; |
| } |
| UInt32 lo32() const { |
| return value_ >> 24; |
| } |
| |
| private: |
| UInt32 value_; |
| }; |
| |
| } // namespace marisa |
| |
| #endif // MARISA_POPCOUNT_H_ |