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