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