BitMask的使用方式
位操作
在使用 BitMask 前,我们先复习一下基本的位操作。
NOT (非) –> ~
NOT 0000 0001
= 1111 1110
比如:
int a = 1;
int b = ~a;
OR (或) –> |
OR 0000 0001
0000 0010
= 0000 0011
比如:
int a = 1;
int b = 2;
int c = a | b;
AND(和) –> &
AND 0000 0101
0000 0110
= 0000 0100
比如:
int a = 5;
int b = 6;
int c = a & b;
BitMask
我们知道,每一个 bit 可以有两种取值:0 或 1。 BitMask 采用一个数值来记录状态,使用这个数值的每一位来表达一个状态。 使用 BitMask 可用非常少的资源表达非常丰富的状态。
在 Java 中,一个 byte 类型,有 8 位(bit),可以表达 8 个不同的状态,并且这些状态是互不影响的。而 int 类型,则有 32 位,可以表达 32 种状态。
更为重要的是,基于 BitMask 可 非常简单地 进行组合状态查询。
BitMask 基本操作
假设我们用一个表示状态的数值: status
,初始值为 0。
byte status = 0;
我们定义一个 mask 数值,该数第二位为 1:0000 0010
。
我们把 1 往左移动 1 位来得到这个数:
byte mask = 0x01 << 1;
- 设置状态
其他位不管,把第 2 位变为 1 即可。
xxxx xxxx
OR 0000 0010
= xxxx xx1x
代码
status |= mask;
- 清除状态
其他位不管,把第 2 位置为 0。
xxxx xxxx
AND 1111 1101
= xxxx xx0x
这实际是对 status
和 mask
的反码进行逻辑『与』运算:
status &= ~mask;
- 查询状态
确定第 2 位是 0 还是 1,和 mask
进行逻辑『与』运算:
xxxx xxxx
AND 0000 0010
= 0000 00x0
如果为 1,返回一个大于 0 的值,否则返回 0。
boolean isOn = (status & mask) > 0;
Android源码中主要针对FLAG的运算有三种
- 增加属性
"|"
flag
|=
XXX_FLAG; - 移除属性
"&~"
flag &= ~XXX_FLAG;
- 包含属性
"&"
flag & XXX_FLAG != 0 flag & XXX_FLAG = XXX_FLAG
赞 赏
真诚赞赏 手有余香

微信支付

支付宝