有人可以解释这个宏吗?

时间:2013-12-10 04:06:47

标签: objective-c c macros

我看到了这个宏on an Internet page。没有解释它的作用。

   #define UIColorFromRGB(__HEX__, __A__) [UIColor \
        colorWithRed:((float)((__HEX__ & 0xFF0000) >> 16))/255.0 \
        green:((float)((__HEX__ & 0xFF00) >> 8))/255.0 \
        blue:((float)(__HEX__ & 0xFF))/255.0 alpha:__HEX__]

我想它在0xRRGGBB表单上需要一个十六进制数字,并从中提取RRGGBB部分,但这究竟是如何完成的?

或者最具体地说,(__HEX__ & 0xFF0000) >> 16)如何提取数字的第一部分? 抱歉,我从来没有理解这个C的东西。

最后写alpha:__HEX__是不是作者错了?不应该是alpha:__A__

感谢。

1 个答案:

答案 0 :(得分:3)

因此,我们取值0xAABBCC作为颜色。

__HEX__ & 0xFF0000会产生0xAA00000xAA0000 >> 16会产生0xAA0xAA / 255.0会产生0.6667。这是+colorWithRed:green:blue:alpha:正在寻找的价值范围内。

__HEX__ & 0xFF00会产生0xBB000xBB00 >> 8会产生0xBB0xBB / 255.0会产生0.7333。这是+colorWithRed:green:blue:alpha:正在寻找的价值范围内。

__HEX__ & 0xFF会产生0xCC0xCC / 255.0会产生0.8。这是+colorWithRed:green:blue:alpha:正在寻找的价值范围内。

你是对的阿尔法是错的。为简单起见,我只想使用原始A值

#define UIColorFromRGB(__HEX__, __A__) [UIColor \
    colorWithRed:((CGFloat)(((__HEX__) & 0xFF0000) >> 16))/255.0 \
    green:((CGFloat)(((__HEX__) & 0xFF00) >> 8))/255.0 \
    blue:((CGFloat)((__HEX__) & 0xFF))/255.0 alpha:(CGFloat)(__A__)]

预期用途类似于UIColorFromRGB(0xAABBCC, 0.6),此alpha会使0xAABBCC颜色变为60%不透明。


注意

我总是在括号中包装宏参数。这可以防止某些类型的语法或逻辑错误。

+colorWithRed:green:blue:alpha:期望类型CGFloat不是float


<强>更新

有人询问有关位移的更多解释。所以这里。

0x32241608是我构建的一个数字,显示0x32000000是32位数字,0x240000是24但数字,0x1600是16位数字,并且0x08是一个8位数字。

0x32241608 >> 8会产生0x322416。您可以将其视为切断数字的8位部分。

0x32241608 >> 16会产生0x3224。您可以将其视为切断数字的16位部分。

0x32241608 >> 24会产生0x32。您可以将其视为切断数字的24位部分。

0x32241608 >> 32会产生0x0。您可以将其视为切断数字的32位部分,从而减少整数。

回到我的解释。要获得红色值,您需要切断绿色和蓝色值的16位。要获得绿色值,您需要切掉蓝色值的8位。

希望这可以清除位移。