Я реализую математику с фиксированной точкой во встроенной системе, используя C.
Для удобства чтения я указываю знаменатель как степень числа 2:
#define Fixed_Point_Base 4096U
Однако, когда я конвертирую в математику с фиксированной точкой и обратно, мне нужно количество сдвига:
#define Fixed_Point_Bit_Position 12U
Чтобы упростить обслуживание и сделать код более надежным, я хотел бы иметь #define
для битовой позиции (количество сдвигов) с точки зрения числа Fixed_Point_Base:
#define Fixed_Point_Bit_Position(x) {/*...*/}
Единственный известный мне метод включает логарифмы и деление, и я действительно не хочу использовать логарифмы или деление во встроенной системе:
bit count = ln(4096) / ln(2)
Я ищу макрос препроцессора или решение времени компиляции, которое возвращает битовую позицию степени 2.
Мой веб-поиск вернул примеры в коде, но не как решение времени компиляции/препроцессора.
К вашему сведению, я использую IAR Embedded Workbench с процессором ARM7TDMI.
Изменить 1: я использую рекомендации MISRA C 2004 с инструментами Parasoft Static Analysis и Coverity Static Analysis. Ответы должны соответствовать этим ограничениям.
Fixed_Point_Bit_Position
, использоватьFixed_Point_Base(x)
для получения знаменателя) было бы тривиально. Вы не можете сделать это? - person   schedule 27.02.2014Fixed_Point_Base(12)
не так читабельно, как 4096U. - person Thomas Matthews   schedule 27.02.2014