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;

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

  • 相关阅读:
    根据第三方提供的wsdl报文(axis2开发),进行的webservice应用的开发实例
    调用axis2开发的接口遇到的问题
    使用 DJ Java Decompiler 将整个jar包反编译成源文件
    解析Myeclipse项目下的.classpath文件
    使用cxf开发webservice应用时抛出异常
    hibernate 映射 多对一
    jquery获取元素的值,获取当前对象的父对象等等
    web项目中加入struts2、spring的支持,并整合两者
    Struts2中的 配置文件
    对list集合中的对象按照对象的某一属性进行排序
  • 原文地址:https://www.cnblogs.com/universal/p/5425183.html
Copyright © 2011-2022 走看看