【问题标题】:What is the best way to evenly scale one byte?均匀缩放一个字节的最佳方法是什么?
【发布时间】:2010-10-10 20:30:10
【问题描述】:

在 C 中,我需要将 uint8_t 从 0 - 255 缩放到 0 - 31

均匀地做到这一点的最佳方法是什么?

【问题讨论】:

  • uint8_t 不是 256 位 - 它是 8 位。能否提供更多信息?
  • 你是什么意思,确切地说,按比例?
  • 256 位完全错误,更新问题,谢谢。

标签: c integer


【解决方案1】:

如果您尝试从 8 位扩展到 5 位,则可以进行 3 位移位;

uint8_t scaled = (uint8_t)(original >> 3);

这会丢弃低 3 位。

【讨论】:

  • 我认为如果您的原件高于 (255 - 15),则舍入值将失败。
  • @Laserallan:哈哈,我也注意到了! (你发表评论时我一定一直在编辑)
  • 不要四舍五入。我认为你的第一个答案是正确的。它均匀分布结果。
  • 是的,我认为强制转换不是必需的:提升会自动将其转换为 int(“通常的算术转换”)。所以你现在有 (int)(uint16_t)original + 4 有效。没有演员表,你有 ((int)original + 4) 。如果您执行原始 += 4 之类的操作,则会溢出。
  • 如果你的 int 是 32 位,无论如何 :) 如果你有一个 16 位的 int,那么两者都将转换为 (unsigned int) 并首先显式转换为 uint16_t :)。但两者都将是 int 没有显式转换,因为 int 至少有 16 位。无论如何,我不会以挑剔者的身份出现,所以我按原样 +1 :)
【解决方案2】:

你可以使用一些简单的乘法和除法:

uint8_t scaled = (uint8_t)(((uint32_t)original * 32U) / 256U);

【讨论】:

  • 我不确定,但可能希望将原始内容转换为更大的内容,以避免由于 * 32 溢出而导致截断。
  • 仅供参考,此答案与 scaled = (original > 8 相同,与 scale = original >> 3 相同,与接受的答案相同。
猜你喜欢
  • 2017-04-04
  • 1970-01-01
  • 2010-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-20
  • 1970-01-01
  • 2012-11-03
相关资源
最近更新 更多