git / moonbite-core / src/libmw/include/mw/util/BitUtil.h · raw

#pragma once// Copyright (c) 2018-2019 David Burkett// Distributed under the MIT software license, see the accompanying// file LICENSE or http://www.opensource.org/licenses/mit-license.php.#include <cstdint>class BitUtil{public:    static uint64_t FillOnesToRight(const uint64_t input) noexcept    {        uint64_t x = input;        x = x | (x >> 1);        x = x | (x >> 2);        x = x | (x >> 4);        x = x | (x >> 8);        x = x | (x >> 16);        x = x | (x >> 32);        return x;    }    //    // Counts the number of bits set to 1.    //    static uint8_t CountBitsSet(const uint64_t input) noexcept    {        // MW: TODO - use __popcnt64        uint64_t n = input;        uint8_t count = 0;        while (n)        {            count += (uint8_t)(n & 1);            n >>= 1;        }        return count;    }    static uint8_t CountRightmostZeros(const uint64_t input) noexcept    {        assert(input != 0);        uint8_t count = 0;        uint64_t n = input;        while ((n & 1) == 0) {            ++count;            n >>= 1;        }        return count;    }};