Android 位掩码操作(&和~和|的二进制运算)

在 Android 开发中,位掩码操作通过二进制位的逻辑运算实现高效的状态管理。以下以 &(与)、|(或)和 ~(非)运算符为例,详细说明其二进制计算过程:

一、按位与 & 运算

​​规则​​:两位同时为 1 时结果为 1,否则为 0

​​作用​​:提取特定位、清除无关位

​​示例​​:检查权限是否包含某标志位

java 复制代码
int flags = 0b1011;  // 二进制表示:1011(含标志位1、2、4)
int checkFlag = 0b0010; // 检查第2位是否为1

// 按位与运算
int result = flags & checkFlag; // 0b1011 & 0b0010 = 0b0010

​​二进制过程​​:

java 复制代码
  1 0 1 1  
& 0 0 1 0  
------------  
  0 0 1 0

结果非零,说明 flags 包含 checkFlag 标志位。

二、按位或 | 运算

​​规则​​:任意一位为 1 时结果为 1

​​作用​​:合并多个状态标志

​​示例​​:组合多个权限

java 复制代码
int read = 0b0001;  // 读权限(二进制:0001)
int write = 0b0010; // 写权限(二进制:0010)

// 按位或运算
int permissions = read | write; // 0b0001 | 0b0010 = 0b0011

​​二进制过程​​:

java 复制代码
  0 0 0 1  
| 0 0 1 0  
------------  
  0 0 1 1  

结果为 0b0011,表示同时拥有读和写权限。

三、按位非 ~ 运算

​​规则​​:每一位取反(0 → 1,1 → 0)

​​作用​​:生成掩码的反码,用于清除特定位

​​示例​​:移除某个标志位

cpp 复制代码
int flags = 0b1011;    // 原始标志位
int removeFlag = 0b0010; // 需移除第2位

// 按位非运算生成反码,再与原始值按位与
flags &= ~removeFlag;   // ~0b0010 = 0b1101,再与0b1011 & 0b1101 = 0b1001

​​二进制过程​​:

cpp 复制代码
~removeFlag:0b0010 → 0b1101
flags & ~removeFlag:
  1 0 1 1  
& 1 1 0 1  
------------  
  1 0 0 1  

最终 flags 为 0b1001,成功清除第2位。

四、综合应用:状态管理

场景:Android 中 View 的标志位控制

cpp 复制代码
// 定义标志位
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。

五、补码与负数的处理

在 ~ 运算中,需注意计算机以补码存储负数。例如:

cpp 复制代码
int a = 1;       // 二进制:0000...0001
int b = ~a;      // 按位取反:1111...1110(补码形式,值为 -2)

​​补码转换过程​​:

  1. 取反后的二进制 1111...1110 是负数补码。
  2. 转原码:取反加 1 → 0000...0010,即十进制 -2。

总结

  • &:用于 提取 或 清除 特定位(如权限检查)。
  • |:用于 合并 多个状态(如组合标志位)。
  • ~:生成反码,常与 & 配合 清除位(如撤销权限)。

位掩码通过直接操作二进制位实现高效内存利用和快速计算,是 Android 底层优化的核心手段之一。

相关推荐
csj50几秒前
安卓基础之《(27)—真机调试》
android
brahmsjiang2 分钟前
理解Android AOT编译与内存映射:从Zygote启动到页表权限隔离
android·linux·zygote
常利兵6 分钟前
解锁系统设置新姿势:Activity嵌入全解析
android
提子拌饭13311 分钟前
开源鸿蒙跨平台Flutter开发:AR厨艺教学应用
android·flutter·华为·开源·ar·harmonyos·鸿蒙
fengci.19 分钟前
php反序列化(复习)(第四章)
android·开发语言·学习·php·android studio
XiaoLeisj19 分钟前
Android 短视频项目首页开发实战:从广场页广告轮播与网格列表,到发现页分类、播单与话题广场的数据驱动实现
android·okhttp·mvvm·recyclerview·retrofit·databinding·xbanner 轮播
whatever who cares22 分钟前
android中,全局管理数据/固定数据要不要放一起?
android·java·开发语言
冬奇Lab1 小时前
MediaCodec 编解码基础:Buffer 队列、状态机与零拷贝的艺术
android·音视频开发·源码阅读
光影少年1 小时前
Android和iOS原生开发的基础知识对RN开发的重要性,RN打包发布时原生端需要做哪些配置?
android·前端·react native·react.js·ios
Fᴏʀ ʏ꯭ᴏ꯭ᴜ꯭.1 小时前
MySQL主从复制实战配置详解,以及企业级相关优化说明
android·mysql·adb