电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

Android源碼使用16進制進行狀態管理的方法

瀏覽:10日期:2022-09-17 15:46:15
前言

在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進制來表示 二進制,就是因為其可以和二進制進行一個更方便直觀的轉換。

總結

今天和大家介紹了下源碼中常用的通過16進制轉換2進制來管理狀態的方法。

到此這篇關于Android源碼使用16進制進行狀態管理的文章就介紹到這了,更多相關Android 16進制狀態管理內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Android
相關文章:
主站蜘蛛池模板: 不锈钢复合板|钛复合板|金属复合板|南钢集团安徽金元素复合材料有限公司-官网 | 河南卓美创业科技有限公司-河南卓美防雷公司-防雷接地-防雷工程-重庆避雷针-避雷器-防雷检测-避雷带-避雷针-避雷塔、机房防雷、古建筑防雷等-山西防雷公司 | 常州企业采购平台_常州MRO采购公司_常州米孚机电设备有限公司 | 滚塑PE壳体-PE塑料浮球-警示PE浮筒-宁波君益塑业有限公司 | EFM 022静电场测试仪-套帽式风量计-静电平板监测器-上海民仪电子有限公司 | 「银杏树」银杏树行情价格_银杏树种植_山东程锦园林 | 超声波清洗机_超声波清洗机设备_超声波清洗机厂家_鼎泰恒胜 | 沈阳网站建设_沈阳网站制作_沈阳网页设计-做网站就找示剑新零售 沈阳缠绕膜价格_沈阳拉伸膜厂家_沈阳缠绕膜厂家直销 | POS机办理_个人POS机免费领取 - 银联POS机申请首页 | 颚式破碎机,圆锥破碎机,制砂机-新乡市德诚机电制造有限公司 | 施工围挡-施工PVC围挡-工程围挡-深圳市旭东钢构技术开发有限公司 | 联系我们-腾龙公司上分客服微信19116098882 | 山东钢格板|栅格板生产厂家供应商-日照森亿钢格板有限公司 | 液压油缸-液压缸厂家价格,液压站系统-山东国立液压制造有限公司 液压油缸生产厂家-山东液压站-济南捷兴液压机电设备有限公司 | 艾乐贝拉细胞研究中心 | 国家组织工程种子细胞库华南分库 | 杜康白酒加盟_杜康酒代理_杜康酒招商加盟官网_杜康酒厂加盟总代理—杜康酒神全国运营中心 | DDoS安全防护官网-领先的DDoS安全防护服务商 | 上海律师事务所_上海刑事律师免费咨询平台-煊宏律师事务所 | 酒吧霸屏软件_酒吧霸屏系统,酒吧微上墙,夜场霸屏软件,酒吧点歌软件,酒吧互动游戏,酒吧大屏幕软件系统下载 | 南京兰江泵业有限公司-水解酸化池潜水搅拌机-絮凝反应池搅拌机-好氧区潜水推进器 | 上海质量认证办理中心| 自动部分收集器,进口无油隔膜真空泵,SPME固相微萃取头-上海楚定分析仪器有限公司 | 复合土工膜厂家|hdpe防渗土工膜|复合防渗土工布|玻璃纤维|双向塑料土工格栅-安徽路建新材料有限公司 | VI设计-LOGO设计公司-品牌设计公司-包装设计公司-导视设计-杭州易象设计 | 披萨石_披萨盘_电器家电隔热绵加工定制_佛山市南海区西樵南方综合保温材料厂 | 滚塑PE壳体-PE塑料浮球-警示PE浮筒-宁波君益塑业有限公司 | 英思科GTD-3000EX(美国英思科气体检测仪MX4MX6)百科-北京嘉华众信科技有限公司 | 通用磨耗试验机-QUV耐候试验机|久宏实业百科| 电机修理_二手电机专家-河北豫通机电设备有限公司(原石家庄冀华高压电机维修中心) | 橡胶接头_橡胶软接头_可曲挠橡胶接头-巩义市创伟机械制造有限公司 | 掺铥光纤放大器-C/L波段光纤放大器-小信号光纤放大器-合肥脉锐光电技术有限公司 | 减速机_上海宜嘉减速机| 变位机,焊接变位机,焊接变位器,小型变位机,小型焊接变位机-济南上弘机电设备有限公司 | 集装箱箱号识别_自重载重图像识别_铁路车号自动识别_OCR图像识别 | 威海防火彩钢板,威海岩棉复合板,威海彩钢瓦-文登区九龙岩棉复合板厂 | 祝融环境-地源热泵多恒系统高新技术企业,舒适生活环境缔造者! | 北京开业庆典策划-年会活动策划公司-舞龙舞狮团大鼓表演-北京盛乾龙狮鼓乐礼仪庆典策划公司 | 柴油机_柴油发电机_厂家_品牌-江苏卡得城仕发动机有限公司 | Maneurop/美优乐压缩机,活塞压缩机,型号规格,技术参数,尺寸图片,价格经销商 | 光泽度计_测量显微镜_苏州压力仪_苏州扭力板手维修-苏州日升精密仪器有限公司 | 液压升降平台_剪叉式液压/导轨式升降机_传菜机定做「宁波日腾升降机厂家」 |