在Android源码中,发现了大量使用位运算& | ~<<等等。如果不懂二进制位运算一些基本知识,势必会影响以后我们对源码的学习和分析。
比如View类的

还有Intent类的

以及ViewGroup类的

它们有的是
ViewGroup#static final int FLAG_CLIP_CHILDREN =0x1;
Intent#public static final int FLAG_ACTIVITY_FORWARD_RESULT =0x02000000;
这些都是十六进制数,前面0x开头的。
我开始看这些0x十六进制也不是太懂。有的0x后面有一位,有的后面又有几位。
其实主要还是让它们后转换了二进制数在某个位有1,其余是0的情况下,一个1就代表了一种状态。
那么我们就可以利用这个特性来进行按位与(&)和按位或(|)来操作,来达到多个值得判断和组合。
我就用ViewGroup的一些标志位来分析:可以看下图

我是直接把这些十六进制打印出来,然后推算二进制这样好理解一点,然后再换算成1左移多少位来理解的。从箭头指向可以看出来。这些数字正好对应二进制的数某位有1,其余位0的情况。代表一种状态。
下面以一个人的兴趣爱好来分析位运算。人的兴趣爱好可以有很多种,也可以没有。



总结:
当我们需要保存和获取一些事物多状态的场景下,可以使用位运算。节省内存。代码优雅。
public static final int RUNNNING =1 <<0; //跑步0x000001
public static final int DISCO =1 <<2; //蹦迪 0x000100
可以采取这种1<<左移动几位来做你需要的几种标志位。
flag | =a //添加标志a
flag &=~a 移除标志a
flag & a 取出标记a 取出结果a本身 或者0
网友评论