我正在使用C在嵌入式系统上实现定点数学。
为了可读性,我将分母表示为2的幂:

#define Fixed_Point_Base 4096U

但是,当我转换为定点数学时,我需要移位量:
#define Fixed_Point_Bit_Position 12U

为了使维护更容易,代码更健壮,我想用一个#define来表示位位置(移位次数)的固定点基数:
#define Fixed_Point_Bit_Position(x) {/*...*/}

我知道的唯一方法是对数和除法,我真的不想在嵌入式系统中使用对数或除法:
bit count = ln(4096) / ln(2)

我正在寻找一个预处理器宏或编译时解决方案,返回一个2次方的位位置。
我的web搜索返回了代码中的示例,但不是编译时/预处理器解决方案。
仅供参考,我使用的是带有ARM7TDMI处理器的IAR嵌入式工作台。
编辑1:我使用MISRA C 2004指南和Parasoft静态分析和Coverity静态分析工具。答案必须通过这些限制。

最佳答案

你的问题很相关我的一个老问题是:
Is there any way to compute the width of an integer type at compile-time?
接受的答案可以解决你的问题:
https://stackoverflow.com/a/4589384/379897
特别是,使用:

#define Fixed_Point_Bit_Position(x) IMAX_BITS((x)-1)

其中IMAX_BITS是该答案的宏之一。

关于c - 编译时数字的位位置,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22075058/

10-12 19:53