C宏获得比给定数字大2的最小幂

时间:2014-05-30 12:28:17

标签: c bit-manipulation c-preprocessor

我需要一个C宏来获得比给定数字更大的最小功率。

例如,FIRSTFREEBIT(0x16)(二进制1_0110)必须等于0x20

我打算用它作为:

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

类似但略有不同的SO问题: Algorithm for finding the smallest power of two that's greater or equal to a given value

2 个答案:

答案 0 :(得分:2)

这是我的代码,欢迎您发明更好的东西:

#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))))))

答案 1 :(得分:2)

查看__builtin_clz GCC内在因素。它将为您提供前导零位的数量,可用于确定第一个位组的位置。然后左移位1,乘以位置。