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)
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,
void test_bits(void)
{
test_nearest_power();
+ test_bits_is_power_of_two();
test_bits_requiredXX();
test_bits_fraclog();
test_bits_fraclog_const();