implement 16 and 8 bits clz, ctz and popcount

This is needed for utils::bitset8 and bitset16.
This commit is contained in:
Mathias Agopian
2024-04-26 11:15:51 -07:00
committed by Mathias Agopian
parent bf8bcef35c
commit 420f06bef3
2 changed files with 97 additions and 11 deletions

View File

@@ -20,6 +20,8 @@
#include <array>
#include <stdint.h>
using namespace utils;
template <typename T>
@@ -58,6 +60,20 @@ TEST(AlgorithmTest, clz) {
EXPECT_EQ(j, details::clz(i|1));
EXPECT_EQ(j, count_leading_zeros(i));
}
for (uint16_t i = 1, j = 15; j < 16; i *= 2, j--) {
EXPECT_EQ(j, clz(i));
EXPECT_EQ(j, clz(uint16_t(i|1)));
EXPECT_EQ(j, details::clz(i));
EXPECT_EQ(j, details::clz(uint16_t(i|1)));
EXPECT_EQ(j, count_leading_zeros(i));
}
for (uint8_t i = 1, j = 7; j < 8; i *= 2, j--) {
EXPECT_EQ(j, clz(i));
EXPECT_EQ(j, clz(uint8_t(i|1)));
EXPECT_EQ(j, details::clz(i));
EXPECT_EQ(j, details::clz(uint8_t(i|1)));
EXPECT_EQ(j, count_leading_zeros(i));
}
}
TEST(AlgorithmTest, details_ctz) {
@@ -80,6 +96,16 @@ TEST(AlgorithmTest, ctz) {
EXPECT_EQ(j, details::ctz(i));
EXPECT_EQ(j, count_trailing_zeros(i));
}
for (uint16_t i = 1, j = 0; j < 16; i *= 2, j++) {
EXPECT_EQ(j, ctz(i));
EXPECT_EQ(j, details::ctz(i));
EXPECT_EQ(j, count_trailing_zeros(i));
}
for (uint8_t i = 1, j = 0; j < 8; i *= 2, j++) {
EXPECT_EQ(j, ctz(i));
EXPECT_EQ(j, details::ctz(i));
EXPECT_EQ(j, count_trailing_zeros(i));
}
}
TEST(AlgorithmTest, details_popcount) {