【问题标题】:Convert a 32-bit number to 16-bit将 32 位数字转换为 16 位
【发布时间】:2013-05-07 14:53:04
【问题描述】:

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

double percent;
short pct;

percent = (0x0FFF * pct)/100;

但我需要一个 16 位的值来发送到 DAC,而不是 32 位的值。将其转换为 16 位数字的最快方法是什么?可以搬进去吗?

【问题讨论】:

  • 只需将percent 声明为uint16_t?计算是在类型int 上完成的,所以除非你的ints 小于20 位宽,否则它不会溢出。对于 16 位的ints,可以使用0x0FFFul 来避免溢出。
  • @DanielFischer,尽管它们很可能是 16 位宽(事实上,在大多数谈论 DAC 有意义的平台上,它们是)。
  • @phuclv 为什么要编辑这篇文章,在我发布它 6 年后已经编辑过一次?你完全歪曲了我的问题......
  • 我只是在修正一些拼写/语法错误。以何种方式“扭曲”?
  • 不是为了任何东西,但这感觉就像人们只是想通过编辑帖子来获得经验值。 6 年后,这篇文章对修正语法没有任何好处。

标签: c percentage 32-bit 16-bit


【解决方案1】:

这里不需要使用浮点数:

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

【讨论】:

  • 谢谢!!就是这样!
【解决方案2】:

如果您的百分比只有 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];

【讨论】:

    【解决方案3】:
    uint16_t percent;
    uint16_t pct;
    
    percent = (0x0FFFU * pct)/100U; //Gives you in unsigned 16 number.
    

    【讨论】:

    • 虽然这段代码可以回答问题,但最好解释一下如何解决问题,并提供代码作为示例或参考。仅代码的答案可能会令人困惑且缺乏上下文。
    • 这与上面 Paul R 的回答有何不同?
    猜你喜欢
    • 2015-09-30
    • 1970-01-01
    • 2011-10-25
    • 1970-01-01
    • 1970-01-01
    • 2013-10-12
    • 1970-01-01
    • 1970-01-01
    • 2017-04-19
    相关资源
    最近更新 更多