你如何在 C 中使用模运算符分解颜色?

How do you decompose color by using modulo operator in C?

我们以十六进制形式调用颜色信息int color_hex

在C语言中,我使用位运算符(>>)将其分解为R(Red)、G(Green)和B(Blue)。

红色:(color_hex >> 16) & 0xFF
绿色:(color_hex >> 8) & 0xFF
蓝色:(color_hex >> 0) & 0xFF

这个没有问题吧?

我最近看到有人用另一种方式做,那就是:

红色:(color_hex >> 16) % 256 / 255.0
绿色:(color_hex >> 8) % 256 / 255.0
蓝色:(color_hex >> 0) % 256 / 255.0

我对它的工作方式感到困惑。

1)模运算符在这里做什么?
2)除以255.0怎么样?

这些方法产生两种不同的颜色表示。一个将每种颜色的强度表示为从 0 到 255(含)的整数。另一个将每种颜色的强度表示为从0到1(含)的浮点数。

只要x是一个非负整数,x & 0xFF就等价于x % 256% 运算符在除法后产生余数; x % 256x除以256的余数。&按位与; x & 0xFF 产生 x 的低八位。因为所有高于第 8 位的位都表示 2 的 256 或更大的幂,所以只取低 8 位相当于去掉所有 256 的倍数,只留下余数。这就是为什么 x & 0xFFx % 256 等价于非负 x。 (对于负数 x,它们因负数如何用位表示以及 % 产生负余数而不同。)

因为它们是等价的,如果编译器知道左操作数是非负的,就应该将它们优化为相同的代码。

所以问题中显示的两种方法在这一点上是相同的。后者仅除以 255.0 将结果从 0-255 缩放到 0-1。