广告
返回顶部
首页 > 资讯 > 精选 >Android源码如何使用16进制进行状态管理
  • 781
分享到

Android源码如何使用16进制进行状态管理

2023-06-20 14:06:29 781人浏览 安东尼
摘要

这篇文章主要为大家展示了“Android源码如何使用16进制进行状态管理”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Android源码如何使用16进制进行状态管理”这篇文章吧。前言在Andro

这篇文章主要为大家展示了“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("可爱")

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

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

二进制运算

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

按位与(&)

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

举例:0x1 & 0x4

0001 &
0100
     =
0000

按位或(|)

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

举例:0x1 | 0x4

0001 |
0100
     =
0101

取反( ~ )

将一个数按位取反。

举例:~ 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进制进行状态管理”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网精选频道!

--结束END--

本文标题: Android源码如何使用16进制进行状态管理

本文链接: https://www.lsjlt.com/news/297277.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Android源码如何使用16进制进行状态管理
    这篇文章主要为大家展示了“Android源码如何使用16进制进行状态管理”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Android源码如何使用16进制进行状态管理”这篇文章吧。前言在Andro...
    99+
    2023-06-20
  • Android源码使用16进制进行状态管理的方法
    前言 在Android源码中,对于“多状态”的管理总是通过16进制数字来表示,类似这种格式: //ViewGroup.java protected int mGroupFlag...
    99+
    2022-11-12
  • vue之使用vuex进行状态管理详解
    目录vuex进行状态管理vuex状态管理基本使用vuex进行状态管理 首先学习vuex必须先知道vue原理 Vue是一个典型的MVVM框架,模型(Model)只是普通的JavaScr...
    99+
    2022-11-13
  • 如何对Kubernetes对象的状态进行管理
    这篇文章的内容主要围绕如何对Kubernetes对象的状态进行管理进行讲述,文章内容清晰易懂,条理清晰,非常适合新手学习,值得大家去阅读。感兴趣的朋友可以跟随小编一起阅读吧。希望大家通过这篇文章有所收获!我们下面主要聚焦于探究如何对Kube...
    99+
    2023-06-04
  • 在VisualStudio中使用GIT进行源码管理
    GIT作为源码管理的方式现在是越来越流行了,在VisualStudio 2012中,就通过插件的现实对GIT进行了官方支持,并且这个插件在VS2013中已经转正。本文在这里简单的介绍...
    99+
    2022-11-13
  • 如何进行C++代码的资源管理?
    如何进行C++代码的资源管理以C++为例,资源管理是程序开发中非常重要的一环。良好的资源管理可以提高程序的性能和稳定性,减少内存泄漏和资源浪费。本文将介绍一些常用的C++资源管理技术和最佳实践。1.使用智能指针:C++11引入了智能指针的概...
    99+
    2023-11-02
    内存管理 资源分配 C++资源管理
  • React中使用事件驱动进行状态管理的方法
    这篇文章给大家分享的是有关React中使用事件驱动进行状态管理的方法的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。自 Hook 被引入 React  以来,Context API 与 Hook 库在应用...
    99+
    2023-06-14
  • github如何进行代码管理和版本控制
    前言GitHub是一个非常流行且广泛使用的代码托管平台。很多开发者或者团队都会在GitHub上创建自己的代码库,进行代码管理和版本控制。在实现GitHub上代码可用的过程中,有以下几个重要的步骤:创建GitHub账号并Fork项目在本地下载...
    99+
    2023-10-22
  • HTML布局指南:如何使用伪类选择进行链接状态控制
    在网页设计和开发中,链接状态控制是一项非常重要的任务。通过合理地使用伪类选择器,我们可以为链接添加不同的样式,使用户能够清楚地识别链接的状态。本文将介绍如何使用伪类选择来实现链接状态控制,并提供具体的代码示例。一、什么是伪类选择器?伪类选择...
    99+
    2023-10-21
    HTML布局 伪类选择 链接状态控制
  • 如何利用GitLab进行二进制文件管理和存档
    如何利用GitLab进行二进制文件管理和存档GitLab是一种开源的版本控制系统,它使用Git作为版本控制工具,并提供了一个可视化的Web界面。许多人使用GitLab来管理和存档源代码,但是对于二进制文件的管理和存档,一些人可能会感到困惑。...
    99+
    2023-10-22
    管理 gitlab 二进制文件 存档
  • HTML布局指南:如何使用伪类选择器进行元素状态控制
    HTML布局指南:如何使用伪类选择器进行元素状态控制引言:在网页设计中,布局是极为重要的一部分。使用HTML和CSS可以实现各种各样的布局方式,但是有时候我们需要根据元素的状态来控制布局效果。在这篇文章中,我们将学习如何使用伪类选择器来控制...
    99+
    2023-10-26
    HTML布局 状态控制 伪类选择器
  • 如何在 ASP 项目中使用 Git 进行代码管理?
    随着软件开发的不断发展和进步,代码管理变得越来越重要。而Git作为一个流行的代码版本控制工具,受到了越来越多开发者的青睐。本文将介绍如何在ASP项目中使用Git进行代码管理。 一、Git的基本概念 1.1 Git的工作原理 Git的工作原...
    99+
    2023-11-01
    关键字 git 大数据
  • 如何使用SSH进行Linux SysOps管理
    使用SSH进行Linux SysOps管理的步骤如下:1. 确保目标Linux服务器已安装SSH服务器并且已启动。如果没有安装SSH...
    99+
    2023-10-09
    Linux
  • 如何使用vuex进行菜单管理
    这篇文章主要为大家展示了“如何使用vuex进行菜单管理”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何使用vuex进行菜单管理”这篇文章吧。vuex 的优势在...
    99+
    2022-10-19
  • solaris10如何使用projadd进行资源限制的添加
    这篇文章主要介绍了solaris10如何使用projadd进行资源限制的添加,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一...
    99+
    2022-10-18
  • 使用HTTP状态码进行开发过程中的错误处理的有效指导
    在开发过程中如何有效利用HTTP状态码进行错误处理在进行Web开发的过程中,错误处理是一个非常重要的环节。当用户在与我们的网站或应用程序进行交互时,难免会遇到各种错误情况。为了能提供给用户更好的体验,并且能够迅速定位和解决问题,我们应该充分...
    99+
    2023-12-26
    错误处理 HTTP状态码 有效利用
  • 如何使用MySQL MHA源代码进行监控检查
    本篇文章给大家分享的是有关如何使用MySQL MHA源代码进行监控检查,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看...
    99+
    2022-10-18
  • 如何使用Git管理二进制大对象
    这篇文章主要介绍了如何使用Git管理二进制大对象,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。使用 Git 来管理所谓的二进制资产。似乎大家都认可的事就是 Git 对于大的二...
    99+
    2023-06-12
  • 使用Maven如何对项目进行管理
    使用Maven如何对项目进行管理?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。使用 Maven 管理项目时,三层的开发时分模块开发的,parent-dao-se...
    99+
    2023-05-31
    maven mave
  • 如何使用MySQL进行数据安全管理和权限控制?
    如何使用MySQL进行数据安全管理和权限控制?随着互联网时代的到来,数据安全问题越来越引起人们的重视。在数据库管理中,MySQL是一种常用的关系型数据库管理系统,具有强大的数据存储和处理能力。为了确保数据的安全性,MySQL提供了一些功能来...
    99+
    2023-10-22
    MySQL安全管理 MySQL权限控制 数据安全控制
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作