用二進制去控制分享

 案例:
做分享功能,分享功能需求是這樣的,可以分享到:自己的APP廣場,自己的APP中的好友,羣組、微信、朋友圈、微博、QQ,QQ空間八個平臺。現在要根據服務器過來的參數判斷哪些需要顯示,哪些不用顯示。比如參數名稱叫int shareStatu。
我以前的解決方案可能是:1代表羣組顯示,2代表羣組和微信都顯示按照值去判斷。
也可以每個都定義一個變量比如:isShowGroup boolean
但是都比較麻煩


今天才學到的一個技巧

上面相當於是開關係統,權限系統。用二進制的每一位表示一個功能,0表示關,1表示開,比如:11111111表示所有的功能全開。第一位表示廣場,第二位表示羣組,第三位表示私信,第四位表示微信,第五位表示朋友圈,第六位表示微博,第七位表示QQ,第八位表示QQ空間。和服務器定義好協議以後,10000000就表示只有QQ空間可以分享,其他功能隱藏。1表示只有廣場可以分享,其他隱藏。
那麼這個二進制如何在代碼裏去判斷第幾位是1或者0呢,這一這麼算:
二進制在java裏以0b開頭,比如1用二進制在java裏表示爲0b1.
如果要判斷第一位是否爲1,則可以表示爲shareStatu & 0b1 == 1,使用到了與運算,意思就是用前面的和後面的二進制數與,如果相同位都是1則爲1,否則爲0,這樣比如shareStatu=3,也就是011,011&001=001=1.
如果要判斷第三位是否爲1也就是是否可分享到私信,比如shareStatus=5,也就是101,因爲要判斷第三位所以使用與的數也要爲第三位爲1,則爲100,那麼與運算:101&100=100=4,除了判斷第一位,其他位都需要使用位移運算符>>,101&100>>2=1,>>意思是所有位向右移動,這時候就可以判斷是否等於1了,也就是:shareStatu&0b100>>2 == 1.
這裏需要注意的是,位移運算符的計算優先級要高於其他,所以正確的表達式應該是這樣 boolean isOpen = ((shareStatu & 0b100) >> 2 == 1)

剛學到的,分享一下。 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章