我在C代码中有一些冗余,我想避免.
// Q15 macros #define SCALE_FACTOR_Q15 ( 0x00008000UL ) #define Q15_MAX ( 0x00007FFFUL ) #define f32_Q15_x(x) ( (f32)(int) ( (float)(x)*(float)SCALE_FACTOR_Q15 ) ) #define f32_Q15_MAX ( (f32) ( Q15_MAX ) ) // etc... // Q31 macros #define SCALE_FACTOR_Q31 ( 0x80000000UL ) #define Q31_MAX ( 0x7FFFFFFFUL ) #define f32_Q31_x(x) ( (f32)(int) ( (float)(x)*(float)SCALE_FACTOR_Q31 ) ) #define f32_Q31_MAX ( (f32) ( Q31_MAX ) ) // etc...
现在我需要做同样的代码和平Q25
,并且将来可能对其他人来说Qx
,x
在范围内[1,63]
.
我怎么能避免为每个单独写这个Qx
?
这个怎么样?
#define SCALE_FACTOR_Q(N) ( 1UL << N ) #define Q_MAX(N) ( SCALE_FACTOR_Q(N) - 1 ) #define f32_Q_x(N,x) ( (f32)(int) ( (float)(x)*(float)SCALE_FACTOR_Q(N) ) ) #define f32_Q_MAX(N) ( (f32)Q_MAX(N) )