Android源码中的FLAG为何使用16进制
1、在阅读源码的时候经常发现有一些标志属性使用一些位操作来判断是否具有该标志,增加标志或者去除标志。
比如View.java中的
/*** This view does not want keystrokes. Use with TAKES_FOCUS_MASK when* calling setFlags.*/private static final int NOT_FOCUSABLE = 0x00000000;/*** This view wants keystrokes. Use with TAKES_FOCUS_MASK when calling* setFlags.*/private static final int FOCUSABLE = 0x00000001;
为什么要使用16进制呢?为何不使用十进制0,1,2...?原因是因为这样就可以方便的用位运算来表示共同具有某些属性或者直接判断是否具有某个属性。
举个例子:
0x01(0001)可读
0x02(0010)可写
0x04(0100)可执行
那么 0x05(0011)就是即可读又可写,而且可以用 0x05 & 0x01来快速判断是否可读。
2、Android源码中主要针对FLAG的运算有三种
①. 增加属性 "|"
如果需要向flag变量中增加某个FLAG,使用"|"运算符
flag |= XXX_FLAG;
原因: 如果flag变量没有XXX_FLAG,则 | 完后flag对应的位为1,如果有XXX_FLAG,则 | 完后值不会变对应位还是1.
②. 包含属性 "&"
如果需要判断flag变量中是否包含XXX_FLAG,使用"&"运算符
flag & XXX_FLAG != 0 或者 flag & XXX_FLAG = XXX_FLAG
原因: 如果flag变量里包含XXX_FLAG,则&完后flag变量对应的位为1,因为XXX_FLAG的定义保证了只有一位非0,其他位都为0,所以如果是包含的话&运算后值不为0,值为此XXX_FLAG的值,不包含的话值为0.
③.取消属性 "&~"
如果需要取消flag变量的XXX_FLAG, 使用 "&~".
flag &= ~XXX_FLAG;
原因: 先对XXX_FLAG进行取反 则XXX_FLAG原来非0的那一位变为0,则使用&运算符后flag变量非0的那一位变为0,则意味着flag变量不包含XXX_FLAG.
3、使用位移<<操作符
static final int VIEW_STATE_WINDOW_FOCUSED = 1; static final int VIEW_STATE_SELECTED = 1 << 1; static final int VIEW_STATE_FOCUSED = 1 << 2; static final int VIEW_STATE_ENABLED = 1 << 3; static final int VIEW_STATE_ACTIVATED= 1<< 5;和static final int VIEW_STATE_WINDOW_FOCUSED = 0x00000001; static final int VIEW_STATE_SELECTED = 0x00000002; static final int VIEW_STATE_FOCUSED = 0x00000004; static final int VIEW_STATE_ENABLED = 0x00000008; static final int VIEW_STATE_ACTIVATED= 0x00000010;
其实是等价的,只是那样写比较简便。
转载于:https://www.cnblogs.com/universal/p/5425183.html
Android源码中的FLAG为何使用16进制相关推荐
- 【Android 逆向】ART 脱壳 ( InMemoryDexClassLoader 脱壳 | DexFile 构造函数及相关调用函数 | Android 源码中查找 native 函数 )
文章目录 一.DexFile 构造函数 二.DexFile.openInMemoryDexFile 函数 三.Android 源码中查找 native 函数 一.DexFile 构造函数 上一篇博客 ...
- android 源码中的单例,Android源码中的一种单例实现
单例模式的实现方式有懒汉,饿汉,双重校验锁,枚举,内部类等等,写法就不全部列举了.Android源码中有一个单例辅助类/frameworks/base/core/java/android/util/S ...
- android源码使用方法,android源码中使用到的设计模式(创建型)
1.单例模式 1.1定义 确保某个类只有一个实例,而且自行实例化并向整个系统提供者个实例. 1.2单例的形式 饿汉模式:第一次就加载,用空间换时间. public class SingleTon { ...
- android单例模式代码,设计模式(一):Android 源码中的单例模式
设计模式(一):Android 源码中的单例模式 2020-08-17 22:51 阅读数 57 <>什么是单例模式? 单例模式(Singleton) 是最常见也最简单的设计模式,它的目的 ...
- android 静态工厂方法,Android 源码中的静态工厂方法
我们知道工厂模式有三兄弟,通常我们说的工厂模式指的是工厂方法模式,它的应用频率最高.本篇博客分享的简单工厂模式是工厂方法模式的"小弟",确切的来讲它不属于设计模式,而是一种方法.此 ...
- 设计模式(一):Android 源码中的单例模式
什么是单例模式? 单例模式(Singleton) 是最常见也最简单的设计模式,它的目的就是在全局只生成一个类的实例. 什么场合用单例模式 应用中经常有多任务进行信息共享的需求,比如火车票售卖示例中,多 ...
- android底层截图,Android源码中屏幕截图的实现
Android手机一般都自带有手机屏幕截图的功能:在手机任何界面(当然手机要是开机点亮状态),通过按组合键,屏幕闪一下,然后咔嚓一声,截图的照片会保存到当前手机的图库中,真是一个不错的功能! 以我手头 ...
- android 指令模式,Android 源码中的命令模式
原标题:Android 源码中的命令模式 (点击上方公众号,可快速关注) 来源:伯乐在线专栏作者 - PleaseCallMeCoder 链接:http://android.jobbole.com/8 ...
- Android源码环境搭建(aosp Ubuntu 16.04)
Android源码环境搭建(aosp Ubuntu 16.04) FrameWork入门课视频链接:https://edu.csdn.net/course/detail/30298 FrameWork ...
最新文章
- mysql建立高效索引,如何知道你建立的MySQL索引是高效,合理的
- 2021-01-24过去十年十大AI研究热点,分别为深度神经网络、特征抽取、图像分类、目标检测、语义分割、表示学习、生成对抗网络、语义网络、协同过滤和机器翻译。
- 好程序员大数据培训技术分享:Hadoop集群同步
- Java 、Python、C++哪一个发展前景更好?
- asp.net 导出Excel 设置格式
- Android studio之如何快速查看页面的布局
- 企业信息化建设过程中,交通物流行业如何凭借数据成功转型?
- C语言函数一章教学,C语言-第1章教学案.doc
- mysql冷区域热区域_mysql的数据备份方式,及热备与冷备的优缺点对比
- php dw制作购物车,php – 以编程方式向WooCommerce购物车添加免税费用
- bme280中文技术手册_华为认证数通高级路由交换技术高级工程师 V1.0发布通知
- linux DNS 简单配置
- JavaScript 常用技巧收集
- php用putty安装吗,为什么通过Putty的SSH命令与PHP的phpseclib不同?
- 你知道门禁卡的原理吗?手机模拟门禁卡研究
- SICK CLV650-6000固定式扫码枪参数配置
- ico转png(java实现)
- 【python】如何批量修改文件名
- SH7001单电池恒压线性充电IC
- Linux使用Shell定时清理日志文件
热门文章
- 缓存服务的更新策略有哪些?
- Hibernate无法自动建表的缘故
- 【Elasticsearch】如何在 Elasticsearch 中轻松编写脚本
- 【ES】es 查询超时listener timeout after waiting for [60000] ms
- spark报错: Yarn application has already ended! killed or unable to launch application master
- 95-140-108-源码-transform-算子process
- 95-290-035-源码-内存管理-原理与实现:内存管理
- Spring-IOC之BeanDefinitionHolder
- flink 1.9 编译:flink.shaded.netty4.io.netty 找不到
- Unsupported major.minor version 52.0解决办法