ホーム > libalgo

ビット数のカウント

概要

整数をビットで表現したときに立っているビットを数える.__builtin_popcount でもいいが log 時間がかかる.匿名先生によると 16 ビット分前計算するのが最善らしい.

実装

template <typename T>
inline int pop_count(T n) {
    static int dp[0xFFFF];
    if (dp[1] == 0) {
        for (int i = 0; i < 0xFFFF; i++) dp[i] = dp[i / 2] + i % 2;
    }
    static_assert(std::is_integral<T>(), "T must be integer");
    constexpr int sect = sizeof(T) / 2;
    int res = 0;
    for (int i = 0; i < sect; ++i) {
        res += dp[n & 0xFFFF];
        n >>= 16;
    }
    return res;
}