你如何在 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 % 256
是x
除以256的余数。&
按位与; x & 0xFF
产生 x
的低八位。因为所有高于第 8 位的位都表示 2 的 256 或更大的幂,所以只取低 8 位相当于去掉所有 256 的倍数,只留下余数。这就是为什么 x & 0xFF
和 x % 256
等价于非负 x
。 (对于负数 x
,它们因负数如何用位表示以及 %
产生负余数而不同。)
因为它们是等价的,如果编译器知道左操作数是非负的,就应该将它们优化为相同的代码。
所以问题中显示的两种方法在这一点上是相同的。后者仅除以 255.0
将结果从 0-255 缩放到 0-1。
我们以十六进制形式调用颜色信息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 % 256
是x
除以256的余数。&
按位与; x & 0xFF
产生 x
的低八位。因为所有高于第 8 位的位都表示 2 的 256 或更大的幂,所以只取低 8 位相当于去掉所有 256 的倍数,只留下余数。这就是为什么 x & 0xFF
和 x % 256
等价于非负 x
。 (对于负数 x
,它们因负数如何用位表示以及 %
产生负余数而不同。)
因为它们是等价的,如果编译器知道左操作数是非负的,就应该将它们优化为相同的代码。
所以问题中显示的两种方法在这一点上是相同的。后者仅除以 255.0
将结果从 0-255 缩放到 0-1。