32 #define _1BITMASK(b) (((size_t)1)<<(b))
36 #if defined(_MSC_VER) || defined(__WATCOMC__)
37 #define CUINT64(h,l) 0x##h##l##ui64
39 #define CUINT64(h,l) 0x##h##l##ULL
41 #elif defined(USE_LITTLE_ENDIAN)
42 #define CUINT64(h,l) { 0x##l, 0x##h }
44 #define CUINT64(h,l) { 0x##h, 0x##l }
52 static const BYTE k_8 = 8;
57 #define GETSIZEBYTES(nBits) (((nBits)+7)/8)
58 return (nBits + 7) / k_8;
61 template <
typename TYPE>
67 return ((
TYPE)1) << nBit;
69 template <
typename TYPE>
73 return (nVal != 0) && ((nVal & (nVal - 1)) == 0) ;
76 template <
typename TYPE>
80 return (nVal & Mask1<TYPE>(nBit)) ? true : false ;
82 template <
typename TYPE>
86 return (nVal & Mask1<TYPE>(nBit)) ? false : true ;
89 template <
typename TYPE>
92 return nVal | Mask1<TYPE>(nBit);
94 template <
typename TYPE>
97 return nVal & ~Mask1<TYPE>(nBit);
100 template <
typename TYPE>
104 return (nVal & nMask) != 0;
107 template <
typename TYPE>
126 template <
typename TYPE>
133 for (; nMask; nBits++)
140 template <
typename TYPE>
145 return (nVal << nBits) | (nVal >> ((
sizeof(nVal) * k_8) - nBits));
147 template <
typename TYPE>
151 return (nVal >> nBits) | (nVal << ((
sizeof(nVal) * k_8) - nBits));
154 template <
typename TYPE>
160 for (
size_t i = (
sizeof(nVal) * k_8 - 1); i > 0; i--)
166 return nTemp | (nVal & 1);
170 template <
typename TYPE>
181 #if defined(__GNUC__)
183 inline BIT_ENUM_t cBits::Count1Bits<UINT32>(UINT32 nMask)
185 return ::__builtin_popcount(nMask);
188 inline BIT_ENUM_t cBits::Highest1Bit<UINT32>(UINT32 nMask)
193 return 32 - __builtin_clz(nMask);
196 #if defined(USE_INT64)
198 inline BIT_ENUM_t cBits::Count1Bits<UINT64>(UINT64 nMask)
200 return ::__builtin_popcountll(nMask);
203 inline BIT_ENUM_t cBits::Highest1Bit<UINT64>(UINT64 nMask)
208 return 64 - __builtin_clzll(nMask);
215 inline BIT_ENUM_t cBits::Count1Bits<UINT32>(UINT32 nVal) noexcept
218 nVal = (nVal & 0x55555555) + ((nVal & 0xAAAAAAAA) >> 1);
219 nVal = (nVal & 0x33333333) + ((nVal & 0xCCCCCCCC) >> 2);
220 nVal = (nVal + (nVal >> 4)) & 0x0F0F0F0F;
221 nVal = (nVal + (nVal >> 16));
222 nVal = (nVal + (nVal >> 8)) & 0x3F;
230 inline UINT32 cBits::Rotl<UINT32>(UINT32 nVal,
BIT_ENUM_t nBits) noexcept
232 return ::_rotl(nVal, (
int)nBits);
235 inline UINT32 cBits::Rotr<UINT32>(UINT32 nVal,
BIT_ENUM_t nBits) noexcept
237 return ::_rotr(nVal, (
int)nBits);
240 #if !defined(_MANAGED)
242 inline BIT_ENUM_t cBits::Highest1Bit<UINT32>(UINT32 nMask) noexcept
246 if (::_BitScanReverse(&nRet, nMask))
252 #if defined(USE_INT64) && ! defined(UNDER_CE) && defined(_MSC_VER)
255 inline BIT_ENUM_t cBits::Highest1Bit<UINT64>(UINT64 nMask) noexcept
259 if (::_BitScanReverse64(&nRet, nMask))
265 inline UINT64 cBits::Rotl<UINT64>(UINT64 nVal,
BIT_ENUM_t nBits) noexcept
267 return ::_rotl64(nVal, (
int)nBits);
270 inline UINT64 cBits::Rotr<UINT64>(UINT64 nVal,
BIT_ENUM_t nBits) noexcept
272 return ::_rotr64(nVal, (
int)nBits);
278 inline BYTE cBits::Reverse<BYTE>(BYTE nVal) noexcept
283 return (BYTE)(((nVal *
CUINT64(2, 02020202)) &
CUINT64(0108, 84422010)) % 1023);
285 return (BYTE)((((nVal * 0x0802LU & 0x22110LU) | (nVal * 0x8020LU & 0x88440LU)) * 0x10101LU) >> 16);
289 inline UINT32 cBits::Reverse<UINT32>(UINT32 nVal) noexcept
292 nVal = (((nVal & 0xaaaaaaaa) >> 1) | ((nVal & 0x55555555) << 1));
293 nVal = (((nVal & 0xcccccccc) >> 2) | ((nVal & 0x33333333) << 2));
294 nVal = (((nVal & 0xf0f0f0f0) >> 4) | ((nVal & 0x0f0f0f0f) << 4));
295 nVal = (((nVal & 0xff00ff00) >> 8) | ((nVal & 0x00ff00ff) << 8));
296 return((nVal >> 16) | (nVal << 16));
300 inline ULONG cBits::Reverse<ULONG>(ULONG nVal) noexcept
303 #ifdef USE_LONG_AS_INT64
304 return Reverse<UINT64>(nVal);
306 return Reverse<UINT32>(nVal);
310 template <
typename TYPE = UINT32>
333 operator TYPE () const noexcept
#define GRAYCORE_LINK
Definition: GrayCore.h:47
#define TYPE
Definition: StrT.cpp:38
#define CUINT64(h, l)
Definition: cBits.h:39
#define UNITTEST2_PREDEF(x)
Definition: cUnitTestDecl.h:19
#define UNITTEST_FRIEND(n)
Define this in the class body to be unit tested. Allow the unit test to access private/protected stuf...
Definition: cUnitTestDecl.h:17
void ClearBit(BIT_ENUM_t nBit) noexcept
Definition: cBits.h:325
void SetBit(BIT_ENUM_t nBit) noexcept
Definition: cBits.h:321
cBitmask(TYPE uVal=0) noexcept
Definition: cBits.h:318
TYPE m_uVal
Definition: cBits.h:316
bool IsSet(BIT_ENUM_t nBit) const noexcept
Definition: cBits.h:329
< The main namespace for all Core functions.
Definition: GrayCore.cpp:14
BITOP_TYPE
Definition: cBits.h:22
@ BITOP_SET
OR bit operation to set bits.
Definition: cBits.h:28
@ BITOP_CLR
AND/NOT bit operation to clear bits.
Definition: cBits.h:27
@ BITOP_TOGGLE
XOR bit operation to flip bits. Also used for unknown bit state.
Definition: cBits.h:26
unsigned short BIT_SIZE_t
number of bits in some intrinsic type. <= 256 ?
Definition: cBits.h:17
unsigned int BIT_ENUM_t
Enumerate number of bits or address a single bit in some array of bits.
Definition: cBits.h:20
static BIT_ENUM_t Highest1Bit(TYPE nMask) noexcept
Definition: cBits.h:108
static constexpr bool IsClear(TYPE nVal, BIT_ENUM_t nBit) noexcept
Definition: cBits.h:83
static constexpr bool HasMask(TYPE nVal, TYPE nMask) noexcept
Definition: cBits.h:101
static BIT_ENUM_t Count1Bits(TYPE nMask) noexcept
Definition: cBits.h:127
static TYPE Rotl(TYPE nVal, BIT_ENUM_t nBits) noexcept
Definition: cBits.h:141
static constexpr TYPE Mask1(BIT_ENUM_t nBit) noexcept
Definition: cBits.h:62
static constexpr size_t GetSizeBytes(BIT_ENUM_t nBits) noexcept
Definition: cBits.h:54
static constexpr bool IsMask1(TYPE nVal) noexcept
Definition: cBits.h:70
static TYPE Reverse(TYPE nVal) noexcept
Definition: cBits.h:155
static TYPE Rotr(TYPE nVal, BIT_ENUM_t nBits) noexcept
Definition: cBits.h:148
static constexpr bool IsSet(TYPE nVal, BIT_ENUM_t nBit) noexcept
Definition: cBits.h:77
static constexpr TYPE ClearBit(TYPE nVal, BIT_ENUM_t nBit) noexcept
Definition: cBits.h:95
static constexpr TYPE SetBit(TYPE nVal, BIT_ENUM_t nBit) noexcept
Definition: cBits.h:90