20#include "lib/stdcompat/bit.h"
29#define SIZE_OF_IN_BIT(...) (sizeof(__VA_ARGS__) * CHAR_BIT)
33template <std::
size_t kBitW
idth,
typename T>
34constexpr T SignExtend(T nbit_value) {
35 static_assert(std::is_integral_v<T>);
36 static_assert(kBitWidth < SIZE_OF_IN_BIT(T));
38 using SignedT = std::make_signed_t<T>;
40 constexpr std::size_t extension_bits = SIZE_OF_IN_BIT(SignedT) - kBitWidth;
42 SignedT nbit_temp =
static_cast<SignedT
>(nbit_value);
43 return ((nbit_temp << extension_bits) >> extension_bits);
62template <
typename OutType, std::
size_t kMsb, std::
size_t kLsb,
typename InType>
63constexpr OutType ExtractBits(InType value) {
64 static_assert(kMsb >= kLsb);
65 static_assert(kMsb < SIZE_OF_IN_BIT(InType));
67 constexpr std::size_t kBitWidth = kMsb - kLsb + 1;
68 static_assert(kBitWidth <= SIZE_OF_IN_BIT(OutType));
70 if constexpr (kBitWidth == SIZE_OF_IN_BIT(InType)) {
71 return OutType(value);
73 constexpr OutType mask = OutType((OutType(1) << kBitWidth) - 1);
74 return OutType((value >> kLsb) & mask);
Provides basic helpers for reading and writing UTF-8 encoded strings.
Definition: alignment.h:27