用二进制去控制分享

来源:互联网 发布:成都网络外包公司 编辑:程序博客网 时间:2024/04/30 05:01
 案例:
做分享功能,分享功能需求是这样的,可以分享到:自己的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)

刚学到的,分享一下。 
0 0