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

问题描述 投票:0回答:3

我需要一个 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问题: 查找大于或等于给定值的最小二幂的算法

c bit-manipulation c-preprocessor
3个回答
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))))))

2
投票

查看

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


0
投票

这是一个利用 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
}
© www.soinside.com 2019 - 2024. All rights reserved.