当前位置: 首页 > ai >正文

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:0b00100b1101
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)

​​补码转换过程​​:

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

总结

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

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

http://www.xdnf.cn/news/4672.html

相关文章:

  • 【MySQL】(10)用户和权限管理
  • 基于CNN与SHAP可解释性分析的神经网络回归预测模型【MATLAB】
  • 面试问题总结(回忆版)
  • Matter协议,智能家居生态平台的“共生契约”
  • 【Redis】持久化与事务
  • 机器学习与深度学习
  • 图表制作-折柱混合
  • 【办公类-99-05】20250508 D刊物JPG合并PDF便于打印
  • TensorFlow 2.x入门实战:从零基础到图像分类项目
  • 【数据融合实战手册·应用篇】“数字孪生+视频融合”让智慧城市拥有空间感知
  • 手机隐私数据彻底删除工具:回收或弃用手机前防数据恢复
  • 美团、京东、阿里博弈下的冷思考
  • leetcode0279. 完全平方数-medium
  • 手写 Vue 源码 === 依赖清理机制详解
  • 使用 merge_asof 实现高效的时间序列匹配(无需循环)
  • rest_framework学习之认证 权限
  • 【软件设计师:数据库】13.数据库控制与安全
  • vite 代理 websocket
  • 稳定性_李雅普诺夫——Lyapunov直接法
  • 网络靶场基础知识
  • 是更换Window资源管理器的时候了-> Files-community/Files
  • 涨薪技术|0到1学会性能测试第53课-Tomcat配置
  • Python中的re库详细用法与代码解析
  • 在Lua中使用轻量级userdata在C/C++之间传递数据和调用函数
  • 探讨关于智能体(Agent)结合 Dify、大语言模型(LLM)以及 Qwen-3 模型的项目或概念
  • C++-缺省参数
  • 如何在Jmeter中调用C程序?
  • 【软考-高级】【信息系统项目管理师】【论文基础】采购管理过程输入输出及工具技术的使用方法
  • 永久免费的小工具,内嵌微软接口
  • AWS LB target group 监听端口的增加 (TCP还是UDP)