Android源码中的位运算

在看Android源码的时候经常可以看到 |=、&、~这样的符号,对于科班的人来说一般都会认识这些符号啦,就是位运算符嘛,但是现在对于非科班的就会有点蒙圈了,因为我们在学习的时候经常用的是&&、|| 这样的,但是它们变成单个去用的却几乎没遇到过,其实这种也是理解起来也是很简单的,因为这些符号就是将我们的常用运算转化成为二进制来进行运算的,目的就是为了加快运算速率,因为我们现在用的计算机系统使用的基本上都是二进制系统。

简单的了解一下位运算符

& 位与,运算过程就是先将我们的十进制数转换成二进制,然后进行同位“与”比较,如果相同位上的都是1,那么得出的结果这个位上就是1,否则这个位上就是0

| 位或,当然也是十进制先转换成二进制,然后进行同位“或”比较,如果相同位上的有一个是1,那么就是1,其余情况就是0

^ 异或,十进制转二进制~然后同位“异或”比较,如果相同位上的值相同,结果为0,不相同为1

~ 按位取反,十进制转成二进制,不过这个有点特殊,不能当作运算符来使用,只能对某个值进行按位取反操作,也就是同位1变成0,0变成1;使用这个去反过后,我们就能够得到这个数的相反数-1,因为我们使用的计算机是以补码存数据,正数补码是本身,负数补码是取反加1。

下面说一下我在查看源码中遇到的一些二进制运算。

举个栗子:

声明两个变量:

private int mFlag;
private int FLAG_1 = 2;

最常见的就是:(mFlag |= FLAG_1), 代表为mFlag添加FLAG_1属性,换算成十进制和mFlag+=FLAG_1得到的结果是一样的

经常会看到这种判断:(mFlag & FLAG_1)!= 0 ,代表如果已经将FLAG_1 通过这样 “|=” 赋给 mFlag,则 mFlag & FLAG_1 = mFlag,否则 mFlag & FLAG_1 = 0

还有这种运算:mFlag &= ~FLAG_1 ,代表如果已经将 FLAG_1 |= 赋给 mFlag,则减去FLAG_1,如果没有则mFlag的值不变

说白了,其实二进制也没有那么难嘛,短除法大家应该都会,只不过可能我们不能心算二进制罢了,多来几张纸就行了:)



©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页