【问题标题】:C macro to get the smallest power of two greater than a given numberC宏获得大于给定数字的2的最小幂
【发布时间】:2014-07-20 05:12:03
【问题描述】:

我需要一个 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

【问题讨论】:

标签: c bit-manipulation c-preprocessor


【解决方案1】:

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

#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,乘以位置。

【讨论】:

  • 最好的是它在编译时工作!但是:应该是1+__builtin_ffs(x)
  • 哎呀! __builtin_ffs(0x5)=0x1,也就是一定是不同的功能!
  • 啊,是的,ffs 函数返回设置的第一个最低有效位的位置。 __builtin_clz 返回前导零位的数量,可以完成您的工作。
  • 1&lt;&lt;0x20-__builtin_clz(x)
  • 还要确保处理x 为零的情况,因为clz 在这种情况下会返回未定义的结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-24
相关资源
最近更新 更多