Search code examples
cembeddedc-preprocessorcompile-timefixed-point

Bit Position of a Number at Compile Time


I am implementing Fixed Point math on an embedded system using C.

For readability, I state the denominator as a power of 2:

#define Fixed_Point_Base 4096U

However, when I'm converting to and from the Fixed Point math, I need the shift quantity:

#define Fixed_Point_Bit_Position 12U

To make maintenance easier and the code more robust, I would like to have a #define for the bit position (number of shifts) in terms of the Fixed_Point_Base number:

#define Fixed_Point_Bit_Position(x) {/*...*/}

The only method I know involves logarithms and division, and I really don't want to use logarithms or division in an embedded system:

bit count = ln(4096) / ln(2)

I'm looking for a preprocessor macro or compile time solution that returns the bit position of a power of 2.

My web search has returned examples in code, but not as compile-time / preprocessor solution.

FYI, I'm using IAR Embedded Workbench with an ARM7TDMI processor.
Edit 1: I'm using MISRA C 2004 guidelines with Parasoft Static Analysis and Coverity Static Analysis tools. Answers must pass these constraints.


Solution

  • Your question is highly related my an old question of mine:

    Is there any way to compute the width of an integer type at compile-time?

    for which the accepted answer solves your problem:

    https://stackoverflow.com/a/4589384/379897

    In particular, use:

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

    where IMAX_BITS is one of the macros from that answer.