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;
  1. 设置状态

其他位不管,把第 2 位变为 1 即可。

    xxxx xxxx
OR  0000 0010
  = xxxx xx1x

代码

status |= mask;
  1. 清除状态

其他位不管,把第 2 位置为 0。

    xxxx xxxx
AND 1111 1101
  = xxxx xx0x

这实际是对 statusmask 的反码进行逻辑『与』运算:

status &= ~mask;
  1. 查询状态

确定第 2 位是 0 还是 1,和 mask 进行逻辑『与』运算:

    xxxx xxxx
AND 0000 0010
  = 0000 00x0

如果为 1,返回一个大于 0 的值,否则返回 0。

boolean isOn = (status & mask) > 0;

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

  1. 增加属性 "|"

    flag |= XXX_FLAG;

  2. 移除属性 "&~"

    flag &= ~XXX_FLAG;

  3. 包含属性 "&"

    flag & XXX_FLAG != 0 flag & XXX_FLAG = XXX_FLAG

赞 赏
真诚赞赏 手有余香
用微信请张岩喝杯咖啡?

微信支付

用支付宝请张岩喝杯咖啡?

支付宝