zoukankan      html  css  js  c++  java
  • Android源码中的FLAG为何使用16进制

      1、在阅读源码的时候经常发现有一些标志属性使用一些位操作来判断是否具有该标志,增加标志或者去除标志。

    比如View.java中的

        /**
         * This view does not want keystrokes. Use with     TAKES_FOCUS_MASK when
         * calling setFlags.
         */
        private static final int NOT_FOCUSABLE = 0x00000000;
    
        /**
         * This view wants keystrokes. Use with TAKES_FOCUS_MASK     when calling
         * setFlags.
         */
        private static final int FOCUSABLE = 0x00000001;

    为什么要使用16进制呢?为何不使用十进制0,1,2...?原因是因为这样就可以方便的用位运算来表示共同具有某些属性或者直接判断是否具有某个属性。

    举个例子:
    0x01(0001)可读 
    0x02(0010)可写 
    0x04(0100)可执行

    那么 0x05(0011)就是即可读又可写,而且可以用 0x05 & 0x01来快速判断是否可读。

    2、Android源码中主要针对FLAG的运算有三种

    ①. 增加属性 "|"
    如果需要向flag变量中增加某个FLAG,使用"|"运算符
        flag |= XXX_FLAG;
    原因: 如果flag变量没有XXX_FLAG,则 | 完后flag对应的位为1,如果有XXX_FLAG,则 | 完后值不会变对应位还是1. 

    ②. 包含属性 "&"
      如果需要判断flag变量中是否包含XXX_FLAG,使用"&"运算符
      flag & XXX_FLAG  !=  0 或者 flag & XXX_FLAG = XXX_FLAG
    原因: 如果flag变量里包含XXX_FLAG,则&完后flag变量对应的位为1,因为XXX_FLAG的定义保证了只有一位非0,其他位都为0,所以如果是包含的话&运算后值不为0,值为此XXX_FLAG的值,不包含的话值为0. 
    ③.取消属性 "&~"
      如果需要取消flag变量的XXX_FLAG, 使用 "&~". 
      flag &= ~XXX_FLAG;
    原因: 先对XXX_FLAG进行取反 则XXX_FLAG原来非0的那一位变为0,则使用&运算符后flag变量非0的那一位变为0,则意味着flag变量不包含XXX_FLAG. 

    3、使用位移<<操作符

    static final int VIEW_STATE_WINDOW_FOCUSED = 1;
    static final int VIEW_STATE_SELECTED = 1 << 1;
    static final int VIEW_STATE_FOCUSED = 1 << 2;
    static final int VIEW_STATE_ENABLED = 1 << 3;
    static final int VIEW_STATE_ACTIVATED= 1<< 5;
    
    和
    
    static final int VIEW_STATE_WINDOW_FOCUSED = 0x00000001;
    static final int VIEW_STATE_SELECTED = 0x00000002;
    static final int VIEW_STATE_FOCUSED = 0x00000004;
    static final int VIEW_STATE_ENABLED = 0x00000008;
    static final int VIEW_STATE_ACTIVATED= 0x00000010;

    其实是等价的,只是那样写比较简便。

  • 相关阅读:
    第三篇——第二部分——第三文 配置SQL Server镜像——域环境
    DOS命令学习(从入门到精通)
    Cocos2d-x3.0 LoadingBar
    微信对接HIS——微信可查检验结果
    微信iOS SDK文档总结
    Azure编程笔记(4):配置Cloud Service的证书
    android的ViewPager和Animation的一些使用(一)
    小虾米的鳄鱼梦
    Hadoop源码分析21:namenode概要
    Hadoop源码分析20:datanode概要
  • 原文地址:https://www.cnblogs.com/universal/p/5425183.html
Copyright © 2011-2022 走看看