14constexpr inline uint32_t
get_msb32(
const uint32_t in)
16 constexpr std::array<uint8_t, 32> MultiplyDeBruijnBitPosition{ 0, 9, 1, 10, 13, 21, 2, 29, 11, 14, 16,
17 18, 22, 25, 3, 30, 8, 12, 20, 28, 15, 17,
18 24, 7, 19, 27, 23, 6, 26, 5, 4, 31 };
20 uint32_t v = in | (in >> 1);
26 return MultiplyDeBruijnBitPosition[
static_cast<uint32_t
>(v *
static_cast<uint32_t
>(0x07C4ACDD)) >>
27 static_cast<uint32_t
>(27)];
30constexpr inline uint64_t
get_msb64(
const uint64_t in)
32 constexpr std::array<uint8_t, 64> de_bruijn_sequence{ 0, 47, 1, 56, 48, 27, 2, 60, 57, 49, 41, 37, 28,
33 16, 3, 61, 54, 58, 35, 52, 50, 42, 21, 44, 38, 32,
34 29, 23, 17, 11, 4, 62, 46, 55, 26, 59, 40, 36, 15,
35 53, 34, 51, 20, 43, 31, 22, 10, 45, 25, 39, 14, 33,
36 19, 30, 9, 24, 13, 18, 8, 12, 7, 6, 5, 63 };
38 uint64_t t = in | (in >> 1);
44 return static_cast<uint64_t
>(de_bruijn_sequence[(t * 0x03F79D71B4CB0A89ULL) >> 58ULL]);