From: Timo Sirainen Date: Tue, 18 Apr 2017 12:38:59 +0000 (+0300) Subject: lib: Add bits_is_power_of_two() X-Git-Tag: 2.2.30.rc1~77 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=cd955fdc0e2dbd7c282bea66804f277f9bbe2046;p=thirdparty%2Fdovecot%2Fcore.git lib: Add bits_is_power_of_two() --- diff --git a/src/lib/bits.h b/src/lib/bits.h index b9e5f59f26..d030382267 100644 --- a/src/lib/bits.h +++ b/src/lib/bits.h @@ -8,6 +8,13 @@ size_t nearest_power(size_t num) ATTR_CONST; +/* Returns TRUE if 2^x=num, i.e. if num has only a single bit set to 1. */ +static inline bool ATTR_CONST +bits_is_power_of_two(uint64_t num) +{ + return num > 0 && (num & (num - 1)) == 0; +} + #if __GNUC__ > 2 static inline unsigned int ATTR_CONST bits_required32(uint32_t num) diff --git a/src/lib/test-bits.c b/src/lib/test-bits.c index b93848beeb..54756ed288 100644 --- a/src/lib/test-bits.c +++ b/src/lib/test-bits.c @@ -39,6 +39,20 @@ static void test_nearest_power(void) test_end(); } +static void test_bits_is_power_of_two(void) +{ + test_begin("bits_is_power_of_two()"); + for (unsigned int i = 0; i < 64; i++) + test_assert_idx(bits_is_power_of_two(1ULL << i), i); + for (unsigned int i = 2; i < 64; i++) { + test_assert_idx(!bits_is_power_of_two((1ULL << i) - 1), i); + test_assert_idx(!bits_is_power_of_two((1ULL << i) + 1), i); + } + test_assert(!bits_is_power_of_two(0)); + test_assert(!bits_is_power_of_two(0xffffffffffffffffULL)); + test_end(); +} + static void test_bits_requiredXX(void) { /* As ..64 depends on ..32 and tests it twice, @@ -86,6 +100,7 @@ static void test_sum_overflows(void) void test_bits() { test_nearest_power(); + test_bits_is_power_of_two(); test_bits_requiredXX(); test_sum_overflows(); }