38 lines
674 B
C++
38 lines
674 B
C++
#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_
|