【发布时间】:2017-09-13 18:26:27
【问题描述】:
我正在用 C 语言为 32 位 cortex M0 微控制器编写一些软件,并且我正在对 32 位 RGB 值进行大量操作。它们以 32 位整数格式处理,例如 0x00BBRRGG。我希望能够对它们进行数学运算,而不必担心进位位会在颜色之间溢出,因此我需要将它们分成三个 uint8 值。有没有一种有效的方法来做到这一点?我假设低效的方法如下:
blue = (RGB >> 16) & 0xFF;
green = (RGB >> 8) & 0xFF;
red = RGB & 0xFF;
//do math
new_RGB = (blue << 16) | (green << 8) | red;
另外,我有几个接口,其中一个使用0x00RRGGBB 格式,另一个使用0x00BBRRGG。有没有一种有效的方法在两者之间进行转换?
【问题讨论】:
-
你为什么认为它是低效的?你计时了吗?尤其是因为它确实是对单独组件“做数学”的唯一方法。
-
至于另一个问题,而且 BBRRGG 似乎是一种奇怪的格式,您需要一个 24 位 roll (而不是 shift)。尝试搜索算法来进行 n 位滚动。
-
我想我不知道它效率低下,但我没有替代方法来比较它,所以我怎么知道是否有更好的方法?
-
另一种可能的技术(C 标准不保证可移植)是使用 32 位整数的
union和 4uint8_t的数组。您可以从数组中选择颜色,并在要使用整个值时使用 32 位整数。它实际上是否更有效还有待观察——你必须衡量。 -
取决于你做什么样的数学,你也许可以把它打包。有更多的技巧可以防止进位在通道之间传递,而不是像这样的蛮力,你通常可以做一些很好的位数学。
标签: c colors bit-manipulation integer-arithmetic