c++ - 通过位操作获取函数中的值

标签 c++ bit-manipulation bit

在一个特定的图形库中,一个表示具有 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 value 1).

Pick the pixel value 0x8a2be200 (which is an opaque blue-violet color, assuming RGBA).

Original expression (pixel >> (3 - color) * 8) & 0xff

Substitution chain

  1. (0x8a2be200 >> (3 - 1) * 8) & 0xff
  2. (0x8a2be200 >> 2 * 8) & 0xff
  3. (0x8a2be200 >> 16) & 0xff
  4. 0x8a2b & 0xff
  5. 0x2b

使用 color == GREEN 它提取 32 位 RGBAGREEN 颜色分量颜色值。

如果您使用任何其他颜色枚举值(REDBLUEALPHA)做同样的事情,您会看到它还从 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/

相关文章:

C - 有什么方法可以使用位检查来检查数字是否等于 1?

c++ - 在 C++ 中设置 int64 值的最高四位

c++ - 如何从 flatbuffers 中获取 union 结构的 void* 值反序列化的大小

bit-manipulation - 这种神奇的位计数方法是如何工作的?

c++ - 将无符号字符按位左移 16 是什么意思

c - 如何生成 256 位掩码

c++ - 如何从文本文件中读取数据并将其加载到 vector 中?

c++ - 命名空间中的 "string is not a type"

c++ - 为什么我使用soci连接postgresql时没有足够的数据库权限?

C 将字符读取为二进制