Android源码中的FLAG为何使用16进制

本文解析了Android源码中为何使用16进制位操作来管理标志,如NOT_FOCUSABLE和FOCUSABLE的设置,以及AND、OR、NOT运算在FLAG管理中的应用。通过实例演示如何快速判断和操作FLAG属性,以及位移操作在状态标识中的巧妙使用。
摘要由CSDN通过智能技术生成

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)可执行

那么 0x03(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;

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值