涉及按位 SHIFT 和 AND 运算符的反向操作
Reverse opertion involving bitwise SHIFT and AND operators
我是 C 的新手。我有一个函数可以转换三个 unsigned char
或 uint8_t
(r、g 和 b),每个代表红色、蓝色和绿色的颜色值分别。我有一个将它们转换为 R5B6G5 格式的函数。此格式用于在 16 位无符号整数上存储颜色。这意味着前(从左)5 位用于存储红色 (r) 的值,接下来的 6 位用于绿色 (g),最后 5 位用于存储蓝色。函数:
uint16_t R5G6B5(uint8_t r, uint8_t g, uint8_t b) {
return ((r >> 3) << 11) | ((g >> 2) << 5) | (b >> 3);
}
我的问题是如何从给定的 uint16_t
中取回 r(红色)、g(绿色)和 b(蓝色)的三个值。我的理解是我不能,因为按位或操作是不可逆的。但是应用程序似乎能够显示这种格式的颜色,所以我假设它能够以某种方式检索这三个值。
谢谢。
您的函数将 RGB888(每种颜色 8 位)转换为 RGB565(绿色 6 位,其他颜色 5 位。您无法恢复转换中丢失的低位。
该应用程序可能能够显示图像,但该图像不如原始图像精确。您可能会进行反向转换,但同样,您丢失了 2-3 个低位,因此您的图像将永远不一样。
反向转换可以这样进行:
uint16_t rgb565 = some value;
uint8_t red = (rgb565 >> 11) << 3;
uint8_t green = ((rgb565 >> 5) << 2) & 0xFF;
uint8_t blue = (rgb565 << 3) & 0xFF;
是的,您不必担心 OR 运算,因为在您的情况下,操作数永远不会重叠,因此如果 OR 运算期间的信息不会丢失。
我是 C 的新手。我有一个函数可以转换三个 unsigned char
或 uint8_t
(r、g 和 b),每个代表红色、蓝色和绿色的颜色值分别。我有一个将它们转换为 R5B6G5 格式的函数。此格式用于在 16 位无符号整数上存储颜色。这意味着前(从左)5 位用于存储红色 (r) 的值,接下来的 6 位用于绿色 (g),最后 5 位用于存储蓝色。函数:
uint16_t R5G6B5(uint8_t r, uint8_t g, uint8_t b) {
return ((r >> 3) << 11) | ((g >> 2) << 5) | (b >> 3);
}
我的问题是如何从给定的 uint16_t
中取回 r(红色)、g(绿色)和 b(蓝色)的三个值。我的理解是我不能,因为按位或操作是不可逆的。但是应用程序似乎能够显示这种格式的颜色,所以我假设它能够以某种方式检索这三个值。
谢谢。
您的函数将 RGB888(每种颜色 8 位)转换为 RGB565(绿色 6 位,其他颜色 5 位。您无法恢复转换中丢失的低位。
该应用程序可能能够显示图像,但该图像不如原始图像精确。您可能会进行反向转换,但同样,您丢失了 2-3 个低位,因此您的图像将永远不一样。
反向转换可以这样进行:
uint16_t rgb565 = some value;
uint8_t red = (rgb565 >> 11) << 3;
uint8_t green = ((rgb565 >> 5) << 2) & 0xFF;
uint8_t blue = (rgb565 << 3) & 0xFF;
是的,您不必担心 OR 运算,因为在您的情况下,操作数永远不会重叠,因此如果 OR 运算期间的信息不会丢失。