工作中遇到这样的API:
/**
* 用一个24位的整数生成UIColor
* 这个方法实现如下,只会返回不透明的颜色
return [UIColor colorWithRed:((rgb & 0xFF0000) >> 16) / 255.0f
green:((rgb & 0xFF00) >> 8) / 255.0f
blue:((rgb & 0xFF)) / 255.0f
alpha:1.0f];
* @param rgb 形如0xRRGGBB
*/
+ (UIColor *)colorWithRGB:(int)rgb;
首先,理解进制数据前缀:
0x或者0X是16进制的数字前缀,HEX也表示16进制,比方说hexString是#FF00AA,0d表示十进制,0表示八进制,0b或者0B是二进制的数字的前缀。
其次 理解运算符的按位与
运算 :&。
按位与
运算是以其功能是参与运算的两数各对应的二进位相与。只要对应的二个二进位都为1时,结果位就为1。参与运算的两个数均以补码出现。关于补码的介绍在这里:传送门,该运算是讲每一位(例子中的十六进制)转换成二进制,然后按位与,将结果再转换成十六进制。例如0xAABBCC & 0xFF0000 ,A与F进行按位与运算,A转换成二进制是00000110 F转成二进制是00001111 所以A&F就是00000110 & 00001111 等于00000110,再转成十六进制就是A,所以A&F=A。
最后 需要理解位运算符>>
为什么每一个数字转换成二进制都是八位?(待完善)
当0xAABBCC & 0xFF0000得到结果是0xAA0000之后,为了取到AA这两位数的值,我们需要将0xAA0000的AA取出来,最简单的取出方式是位运算,每一个十六进制的数字占4位,所以需要向右平移4个4位,也就是>>16 ,因此最后求得HexString中前两个关于红色的描述FF.
取得其中关于绿色的描述也是同理:((rgb & 0xFF00) >> 8.