9#if __cplusplus >= 202002L
18#include <QtCore/QtTypes>
29static const quint64 QUINT64_MAX = 0xffffffffffffffff;
41constexpr std::array<int, 256> MakeBitsSetTable256() {
42 std::array<int, 256> table = {};
43 for (
int i = 0; i < 256; ++i) {
44 table[i] = (i & 1) + table[i / 2];
51inline constexpr std::array<int, 256> BitsSetTable256 = MakeBitsSetTable256();
60inline int BitCountTable(uint64_t n) {
61 return BitsSetTable256[n & 0xff] +
62 BitsSetTable256[(n >> 8) & 0xff] +
63 BitsSetTable256[(n >> 16) & 0xff] +
64 BitsSetTable256[(n >> 24) & 0xff] +
65 BitsSetTable256[(n >> 32) & 0xff] +
66 BitsSetTable256[(n >> 40) & 0xff] +
67 BitsSetTable256[(n >> 48) & 0xff] +
68 BitsSetTable256[(n >> 56)];
81inline int BitCount(uint64_t n) {
82#if __cplusplus >= 202002L
83 return std::popcount(n);
84#elif defined(_MSC_VER)
85 return static_cast<int>(__popcnt64(n));
86#elif defined(__GNUG__) || defined(__clang__)
87 return __builtin_popcountll(n);
89 return BitCountTable(n);