我正在使用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/