20#include "lib/stdcompat/bit.h"
30#define SIZE_OF_IN_BIT(...) (sizeof(__VA_ARGS__) * CHAR_BIT)
34template <std::
size_t kBitW
idth,
typename T>
36 static_assert(std::is_integral_v<T>);
37 static_assert(kBitWidth < SIZE_OF_IN_BIT(T));
39 using SignedT = std::make_signed_t<T>;
41 constexpr std::size_t extension_bits = SIZE_OF_IN_BIT(SignedT) - kBitWidth;
43 SignedT nbit_temp =
static_cast<SignedT
>(nbit_value);
44 return ((nbit_temp << extension_bits) >> extension_bits);
63template <
typename OutType, std::
size_t kMsb, std::
size_t kLsb,
typename InType>
65 static_assert(kMsb >= kLsb);
66 static_assert(kMsb < SIZE_OF_IN_BIT(InType));
68 constexpr std::size_t kBitWidth = kMsb - kLsb + 1;
69 static_assert(kBitWidth <= SIZE_OF_IN_BIT(OutType));
71 if constexpr (kBitWidth == SIZE_OF_IN_BIT(InType)) {
72 return OutType(value);
74 constexpr OutType mask = OutType((OutType(1) << kBitWidth) - 1);
75 return OutType((value >> kLsb) & mask);
constexpr OutType ExtractBits(InType value)
Definition: bit.h:64
constexpr T SignExtend(T nbit_value)
Definition: bit.h:35
The Pigweed namespace.
Definition: alignment.h:27