Android代码中的位运算

 if (ps != null &&!ps.codePath.equals(ps.resourcePath))  
// 这里的判断逻辑是,如果是forward_app,
           parseFlags|= PackageParser.PARSE_FORWARD_LOCK;


解释:

PackageParser.PARSE_FORWORD_LOCK    这个int值是1<<4   即16

字面看:    parseFlags |=  16

呵呵,能这样理解么?


理解:

1.  PackageParser.PARSE_FORWORD_LOCK    这个int值是1<<4   即16

2.  |   或运算的特点是:

     1  |  0  = 1

     1  |  1  = 1

     0  |  0  = 0

     0  |  1  = 1



 parseFlags|= PackageParser.PARSE_FORWARD_LOCK;

这句话到底是什么意思呢?

如果不联系上下文,这句话的意思是:   把 parseFlags 这个整型数字的第四位设置为1


1. 如果parseFlags  是个单因素影响的控制flag,那么就应该是直接赋值,parseFlags值为PackageParser.PARSE_FORWARD_LOCK


2. 如果parseFlags是多个参数共同影响的一个控制flag标识,假设它原来是这样的一个数字:

(方便起见,假设它的字长是8位)

 1 1 0 0 0 0 1 0


那么这里的:parseFlags|= PackageParser.PARSE_FORWARD_LOCK; 就把parseFlags值变成了  1 1 0 0 1 0 1 0

这么一看,parseFlags显然是一个多用途的 标识,并且当 | 的对象不为0时,就相当于(某位上)取别人的值

来看看下面的例子你就知道了:

    if((parseFlags&PackageParser.PARSE_IS_SYSTEM) != 0) {
           pkg.applicationInfo.flags |= ApplicationInfo.FLAG_SYSTEM;
        }

基础:   

1.  & 的特点是:

      1 & 0 = 0

      1 & 1 = 1

      0 & 0 = 0

      0 & 1 = 0



2.  ApplicationInfo.FLAG_SYSTEM = 1<<0;  即值为1


parseFlags&PackageParser.PARSE_IS_SYSTEM  这个判断,结合 & 运算中,右边为1的情况 1 & 1 = 1 以及   0 & 1 = 0,显然这个判断就是在某一位上是否为0



--------通过上面两个案例(实际上我并没有说的很清楚,具体的还需要你底下仔细想想琢磨一下)----------

android标识用到“与或运算”的时候,大致就两种情况:


1.   或:  用来把标识的某一位置为1    (或运算的右边值一定不为0,可能是1<<n这种形式)

2.   与:   用来查看某一位是否为0     (与运算右边的值一定不为0,可能是1<<n这种形式)


ok. 以后看代码,这些东西怎么快速理解?我给你提供一种思路。  


 //赋值 parseFlags 中的 PARSE_FORWARD_LOCK标志位为1

 parseFlags|= PackageParser.PARSE_FORWARD_LOCK;     


 //查看 parseFlags 中的 PARSE_IS_SYSTEM 标志为是否为0

 (parseFlags&PackageParser.PARSE_IS_SYSTEM) != 0;      


注意:这样快速理解是可以方便你快速看代码,并且这样理解是建立在一定的条件上的。


问:建立在什么样的条件上?为什么可以这样快速理解?

答:尽管位运算的威力,相当大,并且网上也有一篇写的很好的文章,就叫位运算的威力,如果要你利用位运算的特点&机制,设计方案的话,相信你能设计出更完美的方案,但是现在是在看别人的源码,换句话说,利用的是,别人已经实现好的机制,所以一旦理解了它写代码的固定方式或者采用的机制,就可以这样快速理解了。


就这样,不贪多。

merlin

2015/10/20

你可能感兴趣的:(位运算,android)