C宏获取大于给定数的2的最小幂

nkoocmlb  于 2023-11-17  发布在  其他
关注(0)|答案(3)|浏览(116)

我需要一个C宏来获得大于给定数字的2次幂的最小值。
例如,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

js5cn81o

js5cn81o1#

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

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

字符串

jdg4fx2g

jdg4fx2g2#

看看__builtin_clz GCC内部代码。它会给你给予前导零的位数,这可以用来确定第一个位集的位置。然后做一个1的左移位,乘以位置。

deikduxw

deikduxw3#

下面是一个利用GCC _builtin_clz函数的编译时解决方案:

// Lowest Power of 2 greater than or equal to x.  Assumes integer x greater
// than 0
#define LPO2(x) (1<<((sizeof(x)*8)-__builtin_clz((x)-1)))

int main() {
    printf("%d\n", LPO2(7)); // => 8
    printf("%d\n", LPO2(8)); // => 8
    printf("%d\n", LPO2(9)); // => 16
}

字符串

相关问题