用整数"四舍五入"

Ste*_*ven 0 c++ embedded

我正试图摆脱我的功能中的花车.

我有一个函数操作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
Run Code Online (Sandbox Code Playgroud)

如果我们使用浮点数,我的缩减值将是21.6,我可以轻松地将其舍入为22并转换为int8.但是它会截断到21,这是我不想要的.

有没有办法"整理"整数,如果它是合适的,如果它是一个浮点数但没有将任何东西转换为浮点数(甚至是暂时的)?

这可能比我做到的要简单得多.

Nos*_*dna 8

您可以为该值添加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
Run Code Online (Sandbox Code Playgroud)

要么...

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
Run Code Online (Sandbox Code Playgroud)

或根据戴维的答案有点诡计......

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)
Run Code Online (Sandbox Code Playgroud)

.