在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
16进制数转二进制数 0x1 转二进制数可以看作4个部分0000
0000 0000 0000 0001
0x2 转为二进制
0000 0000 0000 0010
0x10
0000 0000 0001 0000
0x80 (相当于在第三个部分为8 那么就是1000 然后其他部分为0000)
0000 0000 1000 0000