c++ - "rounding"整数

标签 c++ embedded

我正在努力摆脱函数中的 float 。

我有一个函数对 16 位整数值进行操作,该值是一个放大的 8 位值。然后将缩小的 8 位发送到输出。

我确定我解释得不好。像这样:

int8 spot_value = 21;  //arbitrary. just need a starting point
int16 running_value;

running_value = spot_value << 8;  //multiply by 256 which is 5376
running_value += 154;  //my upscaled value is now 5530
spot_value = running_value >> 8;  //downscale again

如果我们使用 float ,我缩小后的值将是 21.6,我可以轻松地将其四舍五入为 22 并转换为 int8。但它会截断为我不想要的 21。

如果它是一个 float 但不将任何内容转换为 float (即使是暂时的),如果这样做是合适的,是否有一种方法可以将整数“四舍五入”?

这可能比我想象的要简单得多。

最佳答案

您可以将 1/2 添加到该值。在您的缩放系统中为 128。

int8 spot_value = 21;  //arbitrary. just need a starting point
int16 running_value;

running_value = spot_value << 8;  //multiply by 256 which is 5376
running_value += 154;  //my upscaled value is now 5530
spot_value = running_value + 128;  //add an additional 1/2 for rounding
spot_value = spot_value >> 8;  //downscale again

或者...

scale_shift = 8;
scale = 1 << scale_shift
round = scale >> 1;

int8 spot_value = 21;  //arbitrary. just need a starting point
int16 running_value;

running_value = spot_value << scale_shift;  //multiply by 256 which is 5376
running_value += 154;  //my upscaled value is now 5530
spot_value = (running_value + round) >> scale_shift;  //downscale again

或者基于 Dav 的回答的小技巧......

running_value = spot_value << scale_shift;  //multiply by 256 which is 5376
running_value += 154;  //my upscaled value is now 5530
spot_value = (running_value >> 8) + ((running_value >> 7) & 1)

.

关于c++ - "rounding"整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1384348/

相关文章:

c - 虽然循环等待全局变量不触发

c++ - 调用 `clock()`会产生错误:对 `_times'的 undefined reference

c++ - 绘图类组织

c++ - 在跨平台 cmake 项目中设置编译器标志的现代方法

c++ - 数据流 Qt 到标准 C++ 代码

linux - 嵌入式 Linux 单核低延迟进程

embedded - AUTOSAR 开发

c++ - 对象在 assembly 级的x86中如何工作?

c++ - 从裸数据到 C++ 包装器的类型转换

c++ - 在 Visual C++ 中使用 union