13 #include "datatypes.h" 16 #include <type_traits> 18 BEGIN_NAMESPACE_DATATYPES
26 template <typename T = uint32_t, typename UT = typename std::make_unsigned<T>::type>
27 constexpr
static UT lsbMask(
int N);
29 template <typename T = uint32_t, typename UT = typename std::make_unsigned<T>::type>
30 constexpr
static UT lsbInvMask(
int N);
32 template <typename T = uint32_t, typename UT = typename std::make_unsigned<T>::type>
33 constexpr
static UT msbMask(
int N);
35 template <typename T = uint32_t, typename UT = typename std::make_unsigned<T>::type>
36 constexpr
static UT msbInvMask(
int N);
39 constexpr
static T reverseBitOrder(T N);
42 template <
typename T,
typename UT>
43 constexpr UT BitHelper::lsbMask(
int N)
45 using SignedSize = std::make_signed_t<std::size_t>;
47 if (((SignedSize)
sizeof(UT) * 8) <= N)
48 return (std::numeric_limits<UT>::max)();
50 return UT(~((std::numeric_limits<UT>::max)() << N));
53 template <
typename T,
typename UT>
54 constexpr UT BitHelper::lsbInvMask(
int N)
56 return ~lsbMask<T, UT>(N);
59 template <
typename T,
typename UT>
60 constexpr UT BitHelper::msbMask(
int N)
62 using SignedSize = std::make_signed_t<std::size_t>;
64 if (((SignedSize)
sizeof(UT) * 8) <= N)
65 return (std::numeric_limits<UT>::max)();
67 return UT(~((std::numeric_limits<UT>::max)() >> N));
70 template <
typename T,
typename UT>
71 constexpr UT BitHelper::msbInvMask(
int N)
73 return ~msbMask<T, UT>(N);
77 constexpr T BitHelper::reverseBitOrder(T N)
80 int numberOfBits =
sizeof(N) * CHAR_BIT;
81 for (
int i = 0; i < numberOfBits; i++)
83 reverseValue = (reverseValue << 1) | (N & 1);
89 END_NAMESPACE_DATATYPES
The class BitHelper implements functions for handling bits.
Definition: bithelper.h:23