让我们以十六进制形式int color_hex
呼叫颜色信息
在C语言中,我使用按位运算符(>>)将其分解为R(红色),G(绿色)和B(蓝色)。
红色:(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怎么样?
这些方法产生两种不同的颜色表示形式。 1代表每种颜色的强度,范围是0到255(含)之间的整数。另一个表示每种颜色的强度,为从0到1(含)的浮点数。
只要x
是一个非负整数,x & 0xFF
等效于x % 256
。 %
运算符在除法后产生余数; x % 256
是x
除以256时的余数。 &
产生x & 0xFF
的低8位。由于第八位上方的所有位均表示256或更大的2的幂,因此仅取低8位就等于除去256的所有倍数,仅剩下余数。这就是为什么x
和x & 0xFF
等于非负x % 256
的原因。 (对于负数x
,它们的区别是因为用位表示负数的方式以及x
产生负余数的原因。)
由于它们是等效的,如果编译器知道左操作数为非负数,则应将它们优化为相同的代码。
因此问题中显示的两种方法到那时都是相同的。后者仅用%
除以将结果从0-255缩放到0-1。