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

问题描述 投票:0回答:1

让我们以十六进制形式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怎么样?

c graphics colors hex bit-manipulation
1个回答
3
投票

这些方法产生两种不同的颜色表示形式。 1代表每种颜色的强度,范围是0到255(含)之间的整数。另一个表示每种颜色的强度,为从0到1(含)的浮点数。

只要x是一个非负整数,x & 0xFF等效于x % 256%运算符在除法后产生余数; x % 256x除以​​256时的余数。 &产生x & 0xFF的低8位。由于第八位上方的所有位均表示256或更大的2的幂,因此仅取低8位就等于除去256的所有倍数,仅剩下余数。这就是为什么xx & 0xFF等于非负x % 256的原因。 (对于负数x,它们的区别是因为用位表示负数的方式以及x产生负余数的原因。)

由于它们是等效的,如果编译器知道左操作数为非负数,则应将它们优化为相同的代码。

因此问题中显示的两种方法到那时都是相同的。后者仅用%除以​​将结果从0-255缩放到0-1。

© www.soinside.com 2019 - 2024. All rights reserved.