千家信息网

Android源码怎么使用16进制进行状态管理

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,这篇"Android源码怎么使用16进制进行状态管理"文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一
千家信息网最后更新 2026年11月02日Android源码怎么使用16进制进行状态管理

这篇"Android源码怎么使用16进制进行状态管理"文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇"Android源码怎么使用16进制进行状态管理"文章吧。

前言

在Android源码中,对于"多状态"的管理总是通过16进制数字来表示,类似这种格式:

//ViewGroup.javaprotected int mGroupFlags;static final int FLAG_CLIP_CHILDREN = 0x1;private static final int FLAG_CLIP_TO_PADDING = 0x2;static final int FLAG_INVALIDATE_REQUIRED  = 0x4;private static final int FLAG_RUN_ANIMATION = 0x8;static final int FLAG_ANIMATION_DONE = 0x10;private static final int FLAG_PADDING_NOT_NULL = 0x20;

那么,你有没有想过为什么遇到多状态的管理,就需要用到16进制?

简单的状态表示

来举个实际的例子,我们作为一个人,身上肯定会有很多标签,比如帅气、可爱、博学、机智、懒惰、小气。

针对这些标签,我们就可以设定不同的人设:

//定义实体类        data class Person(var tag : String)//修改标签        val person1 = Person("帅气") //判断标签   fun isCute():Boolean{           return person1.tag == "可爱"   }

当一个人只有一个标签的时候是很简单的,直接赋值或者取值判断即可。但是,如果一个人有多个标签呢?

也很简单,使用集合存储即可:

val person2 = Person(mutableListOf())    person2.tags.add("帅气")    person2.tags.add("可爱")    person2.tags.remove("可爱")    person2.tags.contains("可爱")   

但是用到集合之后,这个计算就变得比较复杂了,由于remove和contains方法都是通过遍历集合的方式实现的,从时间复杂度角度看的话,当删除某个标签或者判断某个标签是否存在的时间复杂度都是O(n)。

有没有什么办法让多个标签也像刚才的单个标签那么简单地使用操作呢?

二进制运算

当然有啦,不然这篇文章也不会有了,在这之前,我们先复习下二进制的几种运算。

1、按位与(&)

当两个对应位的值都为1,则结果为1,否则为0。

举例:0x1 & 0x4

0001 &
0100
=
0000

2、按位或(|)

当两个对应位的值都只要有一位是1,则结果为1。

举例:0x1 | 0x4

0001 |
0100
=
0101

3、取反( ~ )

将一个数按位取反。

举例:~ 0x1

0001 ~
=
1110

好了,有了这三种运算,我们的状态管理就足够了。

引入16进制

接下来,就来完成一个完整的状态管理例子。

//设定所有状态对应的16进制值//可爱,对应二进制0001val TAG_CUTE = Ox1  //帅气,对应二进制0010 val TAG_HANDSOME = Ox2//博学,对应二进制0100val TAG_LEARNED = Ox4var personTag = 0

状态增加

如果一个二进制数字想留下另一个二进制数字的痕迹(数字1的痕迹),我们可以通过或运算,这样只要第二个数字某位上有1,那么最终的结果在同样的位数肯定也是1。

所以,我们可以通过这个方法来完成状态增加的功能:

//增加可爱状态personTag |= TAG_CUTE0000 |0001 =0001

这样操作之后,personTag的第四位上的数字就为1了,也就带有TAG_CUTE这个标记了。

状态移除

按照上述的逻辑,状态的移除其实就是需要把对应的位数从1改为0。

假设personTag现在的值变成了二进制数0111。

如果要删除TAG_CUTE属性,就需要把第四位的1改为0。那么我们可以做的操作就是先对TAG_CUTE取反,也就是把0001,变成了1110。然后再和personTag进行与运算,这样第四位肯定就会变为0,而其他位上面的值不变。

//personTag为二进制数0111personTag &= ~TAG_CUTE0001 ~=1110 &0111=0110

完成对TAG_CUTE状态的移除。

状态判断

同理,对是否有某个状态的判断,其实就是判断在某个位上是否值为1。
所以我们只需要对状态进行 与运算,如果结果为0,就代表没有这个状态,否则就代表有这个状态。

//personTag为二进制数0111(personTag & TAG_CUTE) != 00111 &0001=0001

结果不为0,所以代表personTag 包含了 TAG_CUTE 这个状态。

注意的点

细心的朋友可能会发现,刚才我们用到的16进制值,跳过了Ox3这个值,这是为什么呢?

其实不难发现,所谓的通过16进制管理状态,其实是通过二进制来管理状态,归根结底是通过二进制中的1所在的位数来进行管理。

所以我们对状态赋值,需要选取单独占有一位的二进制值,比如 0001 ,0010,0100,1000,10000等等。

如果用了其他值会发生什么呢?举个例子,增加Ox3的TAG。

//懒惰,对应二进制0011val TAG_LAZY = Ox3//增加可爱状态personTag |= TAG_CUTE//增加帅气状态personTag |= TAG_HANDSOME

在我们增加了可爱和帅气状态之后,personTag的二进制值为 0011。

这时候再对它进行判断,是否含有懒惰状态:

//是否含有懒惰状态(personTag & TAG_LAZY) != 00011 &0011 =0011

结果不为0,难道我们增加了懒惰状态吗?很明显没有,我不懒但是却说我懒,这是诬陷!

所以你明白状态取值的范围了吗?

为什么是16进制?

到此,通过16进制管理状态的功能已经实现了,很明显这种方式管理状态要简便许多,其根本原理就是通过二进制的计算来完成对状态的管理。

有人又要问了,既然本质是通过二进制来完成管理,那么用10进制来表示也可以啊,比如上述的例子:

//设定所有状态对应的10进制值//可爱,对应二进制0001val TAG_CUTE = 1  //帅气,对应二进制0010 val TAG_HANDSOME = 2//博学,对应二进制0100val TAG_LEARNED = 4var personTag = 0

这跟16进制不是一样么?

从根本来说,确实是一样的,但是16进制有16进制的好处,这就涉及到16进制为什么被设计出来的原因了。

在计算机中,一个字节有八位,最大值为 1111 1111。对应的10进制数是255,对应的16进制是 FF。
所以半个字节用16进制是可以通过一个字母就能表示,而转换成10进制就是一个无规律的数字。
为了方便,代码中一般使用16进制来表示 二进制,就是因为其可以和二进制进行一个更方便直观的转换。

以上就是关于"Android源码怎么使用16进制进行状态管理"这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注行业资讯频道。

状态 进制 二进制 管理 可爱 标签 帅气 就是 数字 结果 运算 懒惰 内容 源码 例子 复杂 博学 个人 代表 位数 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网科技有限公司经营范围 华宇互联网科技 齐家互联网科技 互联网科技公司官网 亿策互联网科技 顺玮阁互联网科技 长亮科技 互联网金融 互联网科技宣传片 华脉科技工业互联网产品 随着互联网科技发展 常德市电业局互联网科技部 栖莱科技互联网股份有限公司 中国互联网十大科技股排名 特约风豹互联网科技为什么扣费 济南有互联网科技公司吗 上海钢联属于互联网科技股吗 南京一网一红互联网科技有限公司 科技互联网行业投资研究 互联网科技创新方面的资料 前海云享互联网科技 华宇互联网科技 上海宁丞科技互联网 荆州市昕露互联网络科技有限公司 互联网科技扶贫时间 互联网科技包装股份有限公司上市 广州有谷有贝互联网科技有限公司 互联网科技平台产品运营 东风日产互联网科技公司叫什么 现代科技的标志之一的互联网 知域互联网科技有限公司官网
0