13 #ifndef TLX_MATH_POPCOUNT_HEADER 14 #define TLX_MATH_POPCOUNT_HEADER 33 x = x - ((x >> 1) & 0x55);
34 x = (x & 0x33) + ((x >> 2) & 0x33);
35 return static_cast<uint8_t
>((x + (x >> 4)) & 0x0F);
40 x = x - ((x >> 1) & 0x5555);
41 x = (x & 0x3333) + ((x >> 2) & 0x3333);
42 return static_cast<uint16_t
>(((x + (x >> 4)) & 0x0F0F) * 0x0101) >> 8;
48 x = x - ((x >> 1) & 0x55555555);
49 x = (x & 0x33333333) + ((x >> 2) & 0x33333333);
50 return (((x + (x >> 4)) & 0x0F0F0F0F) * 0x01010101) >> 24;
55 x = x - ((x >> 1) & 0x5555555555555555);
56 x = (x & 0x3333333333333333) + ((x >> 2) & 0x3333333333333333);
57 return (((x + (x >> 4)) & 0x0F0F0F0F0F0F0F0F) * 0x0101010101010101) >> 56;
62 #if defined(__GNUC__) || defined(__clang__) 65 static inline unsigned popcount(
unsigned i) {
66 return static_cast<unsigned>(__builtin_popcount(i));
70 static inline unsigned popcount(
int i) {
71 return popcount(static_cast<unsigned>(i));
75 static inline unsigned popcount(
unsigned long i) {
76 return static_cast<unsigned>(__builtin_popcountl(i));
80 static inline unsigned popcount(
long i) {
81 return popcount(static_cast<unsigned long>(i));
85 static inline unsigned popcount(
unsigned long long i) {
86 return static_cast<unsigned>(__builtin_popcountll(i));
90 static inline unsigned popcount(
long long i) {
91 return popcount(static_cast<unsigned long long>(i));
94 #elif defined(_MSC_VER) 97 template <
typename Integral>
98 inline unsigned popcount(Integral i) {
99 if (
sizeof(i) <=
sizeof(
int))
103 return __popcnt64(i);
113 template <
typename Integral>
115 if (
sizeof(i) <=
sizeof(uint8_t))
117 else if (
sizeof(i) <=
sizeof(uint16_t))
119 else if (
sizeof(i) <=
sizeof(uint32_t))
121 else if (
sizeof(i) <=
sizeof(uint64_t))
134 const uint8_t* begin =
reinterpret_cast<const uint8_t*
>(data);
135 const uint8_t* end = begin + size;
137 while (begin + 7 < end) {
138 total +=
popcount(*reinterpret_cast<const uint64_t*>(begin));
141 if (begin + 3 < end) {
142 total +=
popcount(*reinterpret_cast<const uint32_t*>(begin));
145 while (begin < end) {
155 #endif // !TLX_MATH_POPCOUNT_HEADER static unsigned popcount_generic64(uint64_t x)
popcount (count one bits) - generic SWAR implementation
static unsigned popcount_generic8(uint8_t x)
popcount (count one bits) - generic SWAR implementation
unsigned popcount(Integral i)
popcount (count one bits)
static unsigned popcount_generic16(uint16_t x)
popcount (count one bits) - generic SWAR implementation
static unsigned popcount_generic32(uint32_t x)
popcount (count one bits) - generic SWAR implementation from https://stackoverflow.com/questions/109023