Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 将32位数字转换为16位_C_Percentage_32 Bit_16 Bit - Fatal编程技术网

C 将32位数字转换为16位

C 将32位数字转换为16位,c,percentage,32-bit,16-bit,C,Percentage,32 Bit,16 Bit,我需要将一个数字转换为DAC最大值0x0FFF的百分比,因此我的代码如下所示: double percent; short pct; percent = (0x0FFF * pct)/100; 但是我需要一个16位的值来发送到DAC,而不是一个32位的值。将其转换为16位数字的最快方法是什么?我可以将其移入吗?此操作不需要使用浮点: uint16_t val = 0x0fffU * pct / 100U; // convert 0..100 value to 0..4095 对于以下情况,

我需要将一个数字转换为DAC最大值0x0FFF的百分比,因此我的代码如下所示:

double percent;
short pct;

percent = (0x0FFF * pct)/100;

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

此操作不需要使用浮点:

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

对于以下情况,不需要使用浮点:

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

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

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

只需将百分比声明为uint16\t?计算是在int类型下完成的,因此除非int的宽度小于20位,否则它不会溢出。对于16位整数,您可以使用0x0FFFul来避免溢出。@Danielfisher,它们很可能是16位宽的,但事实上,在大多数讨论DAC有意义的平台上,它们都是。@phuclv在我发布这篇文章6年后已经编辑过一次之后,您为什么要编辑这篇文章?你完全歪曲了我的问题……我只是在纠正一些拼写/语法错误。它是以什么方式被扭曲的?不是为了什么,但这感觉就像人们只是试图通过编辑帖子来获得经验点。6年后,这篇帖子对修正语法没有任何好处。只需将百分比声明为uint16\t?计算是在int类型下完成的,因此除非int的宽度小于20位,否则它不会溢出。对于16位整数,您可以使用0x0FFFul来避免溢出。@Danielfisher,它们很可能是16位宽的,但事实上,在大多数讨论DAC有意义的平台上,它们都是。@phuclv在我发布这篇文章6年后已经编辑过一次之后,您为什么要编辑这篇文章?你完全歪曲了我的问题……我只是在纠正一些拼写/语法错误。它是以什么方式被扭曲的?不是为了什么,但这感觉就像人们只是试图通过编辑帖子来获得经验点。6年后,这篇帖子对修正语法没有任何好处。谢谢!!那就对了!谢谢那就对了!虽然此代码可以回答问题,但最好解释如何解决问题,并提供代码作为示例或参考。只有代码的答案可能会令人困惑,并且缺乏上下文。这与上面Paul R的答案有何不同?虽然此代码可以回答问题,但最好解释如何解决问题,并提供代码作为示例或参考。只有代码的答案可能会令人困惑,并且缺乏上下文。这与上面Paul R的答案有何不同?