一.这个遮遮掩掩的家伙是谁
首先强行解释一波啥是位掩码:
- 位表示二进制的值,一位1表示一个状态值.
- 掩码是与目标数值进行位操作的二进制值.
简单理解就是有多种状态的二进制值。
二. 遮掩的用处
肯定不是装X用的,主要是有两点:
- 快,计算机采用二进制,位操作快
- 需要多个布尔值的场景,例如权限
三. 掩码和指定值的操作
假设mask为掩码,A为指定状态,主要包含位操作如下,
// 获取A状态
mask & A;
// 添加A状态
mask | A;
// 删除A状态
mask & (~A);
四. 源码中使用
位掩码虽然拥有特殊的优势,但是在实际项目中很少直接使用,毕竟二进制对开发者不够友好,
主要还是一些源码会使用到,例如线程池ThreadPoolExecutor
// 高位表示状态,低位表示线程数
private static final int RUNNING = -1 << COUNT_BITS;
private static final int SHUTDOWN = 0 << COUNT_BITS;
private static final int STOP = 1 << COUNT_BITS;
private static final int TIDYING = 2 << COUNT_BITS;
private static final int TERMINATED = 3 << COUNT_BITS;
// 重置状态
private static int runStateOf(int c) { return c & ~CAPACITY; }
// 获取当前线程数
private static int workerCountOf(int c) { return c & CAPACITY; }
private static int ctlOf(int rs, int wc) { return rs | wc; }