diff --git a/src/core/common/bit_utils.cpp b/src/core/common/bit_utils.cpp index 41aafc72c..46d678b29 100644 --- a/src/core/common/bit_utils.cpp +++ b/src/core/common/bit_utils.cpp @@ -38,6 +38,19 @@ namespace ot { +uint8_t CountBitsInMask(uint32_t aMask) +{ + uint8_t count = 0; + + while (aMask != 0) + { + aMask &= aMask - 1; + count++; + } + + return count; +} + uint16_t CountMatchingBits(const uint8_t *aFirst, const uint8_t *aSecond, uint16_t aMaxBitLength) { uint16_t remainingLen = aMaxBitLength; diff --git a/src/core/common/bit_utils.hpp b/src/core/common/bit_utils.hpp index 9da52444a..6afd17813 100644 --- a/src/core/common/bit_utils.hpp +++ b/src/core/common/bit_utils.hpp @@ -61,28 +61,13 @@ static constexpr uint8_t kBitsPerByte = 8; ///< Number of bits in a byte. #define BytesForBitSize(aBitSize) static_cast(((aBitSize) + (kBitsPerByte - 1)) / kBitsPerByte) /** - * Counts the number of `1` bits in the binary representation of a given unsigned int bit-mask value. - * - * @tparam UintType The unsigned int type (MUST be `uint8_t`, `uint16_t`, `uint32_t`, or `uint64_t`). + * Counts the number of `1` bits in the binary representation of a given `uint32_t` bit-mask value. * * @param[in] aMask A bit mask. * * @returns The number of `1` bits in @p aMask. */ -template uint8_t CountBitsInMask(UintType aMask) -{ - static_assert(TypeTraits::IsUint::kValue, "UintType must be an unsigned int (8, 16, 32, or 64 bit len)"); - - uint8_t count = 0; - - while (aMask != 0) - { - aMask &= aMask - 1; - count++; - } - - return count; -} +uint8_t CountBitsInMask(uint32_t aMask); /** * Counts the number of consecutive matching bits between two byte arrays. diff --git a/tests/unit/test_bit_utils.cpp b/tests/unit/test_bit_utils.cpp index 4e32df927..21c5c23cc 100644 --- a/tests/unit/test_bit_utils.cpp +++ b/tests/unit/test_bit_utils.cpp @@ -37,23 +37,28 @@ namespace ot { void TestCountBitsInMask(void) { - VerifyOrQuit(CountBitsInMask(0) == 0); - VerifyOrQuit(CountBitsInMask(1) == 1); - VerifyOrQuit(CountBitsInMask(2) == 1); - VerifyOrQuit(CountBitsInMask(3) == 2); - VerifyOrQuit(CountBitsInMask(4) == 1); - VerifyOrQuit(CountBitsInMask(7) == 3); - VerifyOrQuit(CountBitsInMask(11) == 3); - VerifyOrQuit(CountBitsInMask(15) == 4); - VerifyOrQuit(CountBitsInMask(0x11) == 2); - VerifyOrQuit(CountBitsInMask(0xef) == 7); - VerifyOrQuit(CountBitsInMask(0xff) == 8); + VerifyOrQuit(CountBitsInMask(0) == 0); + VerifyOrQuit(CountBitsInMask(1) == 1); + VerifyOrQuit(CountBitsInMask(2) == 1); + VerifyOrQuit(CountBitsInMask(3) == 2); + VerifyOrQuit(CountBitsInMask(4) == 1); + VerifyOrQuit(CountBitsInMask(7) == 3); + VerifyOrQuit(CountBitsInMask(11) == 3); + VerifyOrQuit(CountBitsInMask(15) == 4); + VerifyOrQuit(CountBitsInMask(0x11) == 2); + VerifyOrQuit(CountBitsInMask(0xef) == 7); + VerifyOrQuit(CountBitsInMask(0xff) == 8); - VerifyOrQuit(CountBitsInMask(0) == 0); - VerifyOrQuit(CountBitsInMask(0xff00) == 8); - VerifyOrQuit(CountBitsInMask(0xff) == 8); - VerifyOrQuit(CountBitsInMask(0xaa55) == 8); - VerifyOrQuit(CountBitsInMask(0xffff) == 16); + VerifyOrQuit(CountBitsInMask(0xff00) == 8); + VerifyOrQuit(CountBitsInMask(0xaa55) == 8); + VerifyOrQuit(CountBitsInMask(0xffff) == 16); + + VerifyOrQuit(CountBitsInMask(0x10000) == 1); + VerifyOrQuit(CountBitsInMask(0xff0055) == 12); + VerifyOrQuit(CountBitsInMask(0xaa0055) == 8); + VerifyOrQuit(CountBitsInMask(0xaa007700) == 10); + VerifyOrQuit(CountBitsInMask(0xffff0000) == 16); + VerifyOrQuit(CountBitsInMask(0xffffffff) == 32); printf("TestCountBitsInMask() passed\n"); }