av一区二区在线观看_亚洲男人的天堂网站_日韩亚洲视频_在线成人免费_欧美日韩精品免费观看视频_久草视

您的位置:首頁技術(shù)文章
文章詳情頁

Android源碼使用16進(jìn)制進(jìn)行狀態(tài)管理的方法

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

在Android源碼中,對于“多狀態(tài)”的管理總是通過16進(jìn)制數(shù)字來表示,類似這種格式:

//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;

那么,你有沒有想過為什么遇到多狀態(tài)的管理,就需要用到16進(jìn)制?

簡單的狀態(tài)表示

來舉個(gè)實(shí)際的例子,我們作為一個(gè)人,身上肯定會有很多標(biāo)簽,比如帥氣、可愛、博學(xué)、機(jī)智、懶惰、小氣。

針對這些標(biāo)簽,我們就可以設(shè)定不同的人設(shè):

//定義實(shí)體類data class Person(var tag : String)//修改標(biāo)簽val person1 = Person('帥氣') //判斷標(biāo)簽 fun isCute():Boolean{ return person1.tag == '可愛' }

當(dāng)一個(gè)人只有一個(gè)標(biāo)簽的時(shí)候是很簡單的,直接賦值或者取值判斷即可。但是,如果一個(gè)人有多個(gè)標(biāo)簽?zāi)兀?/p>

也很簡單,使用集合存儲即可:

val person2 = Person(mutableListOf()) person2.tags.add('帥氣') person2.tags.add('可愛') person2.tags.remove('可愛') person2.tags.contains('可愛')

但是用到集合之后,這個(gè)計(jì)算就變得比較復(fù)雜了,由于remove和contains方法都是通過遍歷集合的方式實(shí)現(xiàn)的,從時(shí)間復(fù)雜度角度看的話,當(dāng)刪除某個(gè)標(biāo)簽或者判斷某個(gè)標(biāo)簽是否存在的時(shí)間復(fù)雜度都是O(n)。

有沒有什么辦法讓多個(gè)標(biāo)簽也像剛才的單個(gè)標(biāo)簽?zāi)敲春唵蔚厥褂貌僮髂兀?/p>二進(jìn)制運(yùn)算

當(dāng)然有啦,不然這篇文章也不會有了,在這之前,我們先復(fù)習(xí)下二進(jìn)制的幾種運(yùn)算。

1、按位與(&)

當(dāng)兩個(gè)對應(yīng)位的值都為1,則結(jié)果為1,否則為0。

舉例:0x1 & 0x4

0001 &0100 =0000

2、按位或(|)

當(dāng)兩個(gè)對應(yīng)位的值都只要有一位是1,則結(jié)果為1。

舉例:0x1 | 0x4

0001 |0100 =0101

3、取反( ~ )

將一個(gè)數(shù)按位取反。

舉例:~ 0x1

0001 ~ =1110

好了,有了這三種運(yùn)算,我們的狀態(tài)管理就足夠了。

引入16進(jìn)制

接下來,就來完成一個(gè)完整的狀態(tài)管理例子。

//設(shè)定所有狀態(tài)對應(yīng)的16進(jìn)制值//可愛,對應(yīng)二進(jìn)制0001val TAG_CUTE = Ox1 //帥氣,對應(yīng)二進(jìn)制0010 val TAG_HANDSOME = Ox2//博學(xué),對應(yīng)二進(jìn)制0100val TAG_LEARNED = Ox4var personTag = 0狀態(tài)增加

如果一個(gè)二進(jìn)制數(shù)字想留下另一個(gè)二進(jìn)制數(shù)字的痕跡(數(shù)字1的痕跡),我們可以通過或運(yùn)算,這樣只要第二個(gè)數(shù)字某位上有1,那么最終的結(jié)果在同樣的位數(shù)肯定也是1。

所以,我們可以通過這個(gè)方法來完成狀態(tài)增加的功能:

//增加可愛狀態(tài)personTag |= TAG_CUTE0000 |0001 =0001

這樣操作之后,personTag的第四位上的數(shù)字就為1了,也就帶有TAG_CUTE這個(gè)標(biāo)記了。

狀態(tài)移除

按照上述的邏輯,狀態(tài)的移除其實(shí)就是需要把對應(yīng)的位數(shù)從1改為0。

假設(shè)personTag現(xiàn)在的值變成了二進(jìn)制數(shù)0111。

如果要刪除TAG_CUTE屬性,就需要把第四位的1改為0。那么我們可以做的操作就是先對TAG_CUTE取反,也就是把0001,變成了1110。然后再和personTag進(jìn)行與運(yùn)算,這樣第四位肯定就會變?yōu)?,而其他位上面的值不變。

//personTag為二進(jìn)制數(shù)0111personTag &= ~TAG_CUTE0001 ~=1110 &0111=0110

完成對TAG_CUTE狀態(tài)的移除。

狀態(tài)判斷

同理,對是否有某個(gè)狀態(tài)的判斷,其實(shí)就是判斷在某個(gè)位上是否值為1。所以我們只需要對狀態(tài)進(jìn)行 與運(yùn)算,如果結(jié)果為0,就代表沒有這個(gè)狀態(tài),否則就代表有這個(gè)狀態(tài)。

//personTag為二進(jìn)制數(shù)0111(personTag & TAG_CUTE) != 00111 &0001=0001

結(jié)果不為0,所以代表personTag 包含了 TAG_CUTE 這個(gè)狀態(tài)。

注意的點(diǎn)

細(xì)心的朋友可能會發(fā)現(xiàn),剛才我們用到的16進(jìn)制值,跳過了Ox3這個(gè)值,這是為什么呢?

其實(shí)不難發(fā)現(xiàn),所謂的通過16進(jìn)制管理狀態(tài),其實(shí)是通過二進(jìn)制來管理狀態(tài),歸根結(jié)底是通過二進(jìn)制中的1所在的位數(shù)來進(jìn)行管理。

所以我們對狀態(tài)賦值,需要選取單獨(dú)占有一位的二進(jìn)制值,比如 0001 ,0010,0100,1000,10000等等。

如果用了其他值會發(fā)生什么呢?舉個(gè)例子,增加Ox3的TAG。

//懶惰,對應(yīng)二進(jìn)制0011val TAG_LAZY = Ox3//增加可愛狀態(tài)personTag |= TAG_CUTE//增加帥氣狀態(tài)personTag |= TAG_HANDSOME

在我們增加了可愛和帥氣狀態(tài)之后,personTag的二進(jìn)制值為 0011。

這時(shí)候再對它進(jìn)行判斷,是否含有懶惰狀態(tài):

//是否含有懶惰狀態(tài)(personTag & TAG_LAZY) != 00011 &0011 =0011

結(jié)果不為0,難道我們增加了懶惰狀態(tài)嗎?很明顯沒有,我不懶但是卻說我懶,這是誣陷!

所以你明白狀態(tài)取值的范圍了嗎?

為什么是16進(jìn)制?

到此,通過16進(jìn)制管理狀態(tài)的功能已經(jīng)實(shí)現(xiàn)了,很明顯這種方式管理狀態(tài)要簡便許多,其根本原理就是通過二進(jìn)制的計(jì)算來完成對狀態(tài)的管理。

有人又要問了,既然本質(zhì)是通過二進(jìn)制來完成管理,那么用10進(jìn)制來表示也可以啊,比如上述的例子:

//設(shè)定所有狀態(tài)對應(yīng)的10進(jìn)制值//可愛,對應(yīng)二進(jìn)制0001val TAG_CUTE = 1 //帥氣,對應(yīng)二進(jìn)制0010 val TAG_HANDSOME = 2//博學(xué),對應(yīng)二進(jìn)制0100val TAG_LEARNED = 4var personTag = 0

這跟16進(jìn)制不是一樣么?

從根本來說,確實(shí)是一樣的,但是16進(jìn)制有16進(jìn)制的好處,這就涉及到16進(jìn)制為什么被設(shè)計(jì)出來的原因了。

在計(jì)算機(jī)中,一個(gè)字節(jié)有八位,最大值為 1111 1111。對應(yīng)的10進(jìn)制數(shù)是255,對應(yīng)的16進(jìn)制是 FF。所以半個(gè)字節(jié)用16進(jìn)制是可以通過一個(gè)字母就能表示,而轉(zhuǎn)換成10進(jìn)制就是一個(gè)無規(guī)律的數(shù)字。為了方便,代碼中一般使用16進(jìn)制來表示 二進(jìn)制,就是因?yàn)槠淇梢院投M(jìn)制進(jìn)行一個(gè)更方便直觀的轉(zhuǎn)換。

總結(jié)

今天和大家介紹了下源碼中常用的通過16進(jìn)制轉(zhuǎn)換2進(jìn)制來管理狀態(tài)的方法。

到此這篇關(guān)于Android源碼使用16進(jìn)制進(jìn)行狀態(tài)管理的文章就介紹到這了,更多相關(guān)Android 16進(jìn)制狀態(tài)管理內(nèi)容請搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Android
相關(guān)文章:
主站蜘蛛池模板: 国产精品国产a级 | 国产精品精品久久久 | 亚洲国产精品日本 | 久久精品亚洲精品国产欧美 | 成人欧美一区二区三区在线观看 | 国产探花在线观看视频 | 亚洲午夜精品 | 美女天天操 | 国产丝袜人妖cd露出 | 天天干视频网 | 久久精品在线免费视频 | 国产欧美在线视频 | 国产精品av久久久久久久久久 | 久久99精品国产自在现线小黄鸭 | 亚洲精品乱码久久久久久9色 | 有码在线 | 亚洲播放一区 | 91久久精品视频 | 可以免费观看的av片 | 日韩欧美一区在线 | 日韩成人在线观看 | 盗摄精品av一区二区三区 | 日韩在线欧美 | 亚洲精品久久久一区二区三区 | 久草网在线视频 | 国产一区二区三区网站 | 精品国产一区二区三区久久久久久 | 中国美女撒尿txxxxx视频 | 三级特黄特色视频 | 久久精品国产a三级三级三级 | 久久91 | 亚洲精品乱码久久久久久按摩观 | 精品欧美乱码久久久久久1区2区 | 亚洲精品一 | www.99热.com | 99精品视频在线观看 | 伊人狠狠干 | 久视频在线| 日本三级电影免费 | 国产日韩一区二区三区 | 99久久国产综合精品麻豆 |