Android 位掩码操作(和~和|的二进制运算)
在 Android 开发中,位掩码操作通过二进制位的逻辑运算实现高效的状态管理。以下以 &(与)、|(或)和 ~(非)运算符为例,详细说明其二进制计算过程:
一、按位与 & 运算
规则:两位同时为 1 时结果为 1,否则为 0
作用:提取特定位、清除无关位
示例:检查权限是否包含某标志位
int flags = 0b1011; // 二进制表示:1011(含标志位1、2、4)
int checkFlag = 0b0010; // 检查第2位是否为1// 按位与运算
int result = flags & checkFlag; // 0b1011 & 0b0010 = 0b0010
二进制过程:
1 0 1 1
& 0 0 1 0
------------ 0 0 1 0
结果非零,说明 flags 包含 checkFlag 标志位。
二、按位或 | 运算
规则:任意一位为 1 时结果为 1
作用:合并多个状态标志
示例:组合多个权限
int read = 0b0001; // 读权限(二进制:0001)
int write = 0b0010; // 写权限(二进制:0010)// 按位或运算
int permissions = read | write; // 0b0001 | 0b0010 = 0b0011
二进制过程:
0 0 0 1
| 0 0 1 0
------------ 0 0 1 1
结果为 0b0011,表示同时拥有读和写权限。
三、按位非 ~ 运算
规则:每一位取反(0 → 1,1 → 0)
作用:生成掩码的反码,用于清除特定位
示例:移除某个标志位
int flags = 0b1011; // 原始标志位
int removeFlag = 0b0010; // 需移除第2位// 按位非运算生成反码,再与原始值按位与
flags &= ~removeFlag; // ~0b0010 = 0b1101,再与0b1011 & 0b1101 = 0b1001
二进制过程:
~removeFlag:0b0010 → 0b1101
flags & ~removeFlag:1 0 1 1
& 1 1 0 1
------------ 1 0 0 1
最终 flags 为 0b1001,成功清除第2位。
四、综合应用:状态管理
场景:Android 中 View 的标志位控制
// 定义标志位
int FLAG_FOCUSABLE = 1 << 0; // 0b0001
int FLAG_CLICKABLE = 1 << 1; // 0b0010// 设置标志位
int viewFlags = FLAG_FOCUSABLE | FLAG_CLICKABLE; // 0b0011// 清除 FLAG_CLICKABLE
viewFlags &= ~FLAG_CLICKABLE; // 0b0011 & ~0b0010 = 0b0001// 检查 FLAG_FOCUSABLE
boolean hasFocus = (viewFlags & FLAG_FOCUSABLE) != 0; // true
二进制过程分解:设置标志位:0b0001 | 0b0010 = 0b0011
清除标志位:0b0011 & 0b1101 = 0b0001
检查标志位:0b0001 & 0b0001 = 0b0001。
五、补码与负数的处理
在 ~ 运算中,需注意计算机以补码存储负数。例如:
int a = 1; // 二进制:0000...0001
int b = ~a; // 按位取反:1111...1110(补码形式,值为 -2)
补码转换过程:
- 取反后的二进制 1111…1110 是负数补码。
- 转原码:取反加 1 → 0000…0010,即十进制 -2。
总结
- &:用于 提取 或 清除 特定位(如权限检查)。
- |:用于 合并 多个状态(如组合标志位)。
- ~:生成反码,常与 & 配合 清除位(如撤销权限)。
位掩码通过直接操作二进制位实现高效内存利用和快速计算,是 Android 底层优化的核心手段之一。