美文网首页
位运算>>与按位与&运算符在应用中的详解

位运算>>与按位与&运算符在应用中的详解

作者: 平谦 | 来源:发表于2017-05-05 15:15 被阅读495次

    工作中遇到这样的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是二进制的数字的前缀。

    232DB3AAB0C890113FBD474EAEF66D95.png

    其次 理解运算符的按位与运算 :&。
    按位与运算是以其功能是参与运算的两数各对应的二进位相与。只要对应的二个二进位都为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.

    相关文章

      网友评论

          本文标题:位运算>>与按位与&运算符在应用中的详解

          本文链接:https://www.haomeiwen.com/subject/ydxazttx.html