在一个特定的图形库中,一个表示具有 32 位值的像素,由四个字节组成,用于表示四个分量 红色、绿色、蓝色和阿尔法。 可以使用以下定义:
typedef unsigned int Uint32;
typedef unsigned char byte;
enum Color { RED = 0, GREEN = 1, BLUE = 2, ALPHA = 3 };
现在需要两个免费功能:
Byte getColorComponent (Uint32 pixel, Color color);
它通过位操作,检索并返回颜色参数中显示的四个颜色分量之一的值; 和
void setColorComponent (Uint32 & pixel, Byte value, Color color);
它在像素中的正确位置(根据颜色参数)的字节值中停止。
答案是:
Byte getColorComponent(Uint32 pixel, Color color){ return (pixel >> (3-color)*8) & 0xFF; }
void setColorComponent(Uint32& pixel, Byte value, Color color){ pixel &= ~(0xFF << (3-color) * 8); pixel |= value << (3-color) * 8; }
我需要帮助才能理解答案。
最佳答案
帮助解决此类问题的一个好方法是使用普通的笔和纸。为一个或多个变量选取值,在表达式中替换它们。继续替换子表达式,直到有结果。
就像您简化数学表达式一样。
例如 getColorComponent
:
Pick the color
GREEN
(with value1
).Pick the pixel value
0x8a2be200
(which is an opaque blue-violet color, assuming RGBA).Original expression
(pixel >> (3 - color) * 8) & 0xff
Substitution chain
(0x8a2be200 >> (3 - 1) * 8) & 0xff
(0x8a2be200 >> 2 * 8) & 0xff
(0x8a2be200 >> 16) & 0xff
0x8a2b & 0xff
0x2b
使用 color == GREEN
它提取 32 位 RGBA 的 GREEN
颜色分量颜色值。
如果您使用任何其他颜色枚举值(RED
、BLUE
或 ALPHA
)做同样的事情,您会看到它还从 RGBA 颜色值中提取这些分量。
我把它留作练习,让读者使用这种技术弄清楚 setColorComponent
正在做什么。
作为替代方案,与计算机和调试器一起使用,将复杂的表达式拆分为其最小的子表达式,并将结果分配给临时变量。然后使用调试器逐行调试代码,查看结果。
有了这个表达式 (pixel >> (3 - color) * 8) & 0xff
将成为语句
auto t1 = 3 - color; // 3 - color
auto t2 = t1 * 8; // (3 - color) * 8
auto t3 = pixel >> t2; // pixel >> (3 - color) * 8
auto t4 = t3 & 0xff; // (pixel >> (3 - color) * 8) &0xff
关于c++ - 通过位操作获取函数中的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55259589/