将32位数转换为16位

时间:2013-05-13 14:17:56

标签: c percentage 32-bit 16-bit

我需要将数字转换为DAC最大值(0x0FFF)的百分比,所以我的代码就是这样:

double percent;
short pct;

percent = (0x0FFF * pct)/100;

但我需要一个16位值发送到DAC而不是32位。将它转换为16位数的最快方法是什么?我可以把它转移吗?

3 个答案:

答案 0 :(得分:11)

没有必要为此使用浮点数:

uint16_t val = 0x0fffU * pct / 100U; // convert 0..100 value to 0..4095

答案 1 :(得分:3)

如果您的百分比从0到100只有101个值,那么使用查找表比进行乘法/除法要快得多,尤其是在硬件mul / div指令不可用的微控制器中。

大多数MCU都有足够的闪存/ EEPROM可用但缺少RAM,因此表格可以保存在ROM中。从ROM读表可能比从RAM慢,但仍比分割快很多。但是,有些MCU具有较长的读取周期,因此如果有足够的,或者只是使用上面的乘法和除法方法,您可能需要预取或将表加载到RAM中。你也可以打包表(因为你只需要12位)或做其他技巧

#define PCT(n) (0x0fffU * (n) / 100U)

#define PCTROW(n) (PCT(10*n),   PCT(10*n+1), PCT(10*n+2), PCT(10*n+3), PCT(10*n+4),\
                   PCT(10*n+5), PCT(10*n+6), PCT(10*n+7), PCT(10*n+8), PCT(10*n+9))

const uint16_t percent_tbl[] = {
    PCTROW(0), PCTROW(1), PCTROW(2), PCTROW(3), PCTROW(4),
    PCTROW(5), PCTROW(6), PCTROW(7), PCTROW(8), PCTROW(9), 0x0fffU
}

return percent_tbl[pct];

答案 2 :(得分:-1)

uint16_t percent;
uint16_t pct;

percent = (0x0FFFU * pct)/100U; //Gives you in unsigned 16 number.