Android位运算知识

在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 

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容