用二進位制去控制分享

黑風S發表於2015-09-18
 案例:
做分享功能,分享功能需求是這樣的,可以分享到:自己的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)

剛學到的,分享一下。 

相關文章