1

I need a C macro to get the smallest of power two greater than a given number.

For example, FIRSTFREEBIT(0x16) (binary 1_0110) must be equal to 0x20.

I am going to use it as:

#include <someheader.h> // defines SOME_X and SOME_Y
enum {
     x = SOME_X,
     y = SOME_Y,
     z = FIRSTFREEBIT(x|y),
     t = z << 1,
};

A similar, but slightly different SO question: Algorithm for finding the smallest power of two that's greater or equal to a given value

Community
  • 1
  • 1
18446744073709551615
  • 16,368
  • 4
  • 94
  • 127

2 Answers2

2

Here's my code, you are welcome to invent something better:

#define __OR_RSHIFT__(n,x) ((x)|(x)>>n)
#define FIRST_UNUSED_BIT(x) (1+__OR_RSHIFT__(16,__OR_RSHIFT__(8,__OR_RSHIFT__(4,__OR_RSHIFT__(2,__OR_RSHIFT__(1,x))))))
18446744073709551615
  • 16,368
  • 4
  • 94
  • 127
  • 5
    Identifiers starting with two underscores are reserved by language standard for internal needs. You should not use them. – Vovanium May 30 '14 at 12:40
2

Look at the __builtin_clz GCC intrinsic. It will give you the number of leading zero bits, which could be used to determine the position of the first bit set. Then do a left bit shift of 1, times the position.

Blagovest Buyukliev
  • 42,498
  • 14
  • 94
  • 130