文章目录
近期在阅读Android源码中发现了许多与位运算相关的代码,其实以前在使用Intent相关常量的时候也遇到过,但是没有怎么深入了解,今天趁此机会分析一下。
位运算
如果你是windows10的操作系统,你可以打开计算器输入以下十六进制,再把它们转换成二进制数字。
0x10000000(16) = 00010000000000000000000000000000(2)
0x20000000(16) = 00100000000000000000000000000000(2)
0x40000000(16) = 01000000000000000000000000000000(2)
我们首先观察二进制数字,可以发现每个十六进制数字对应的二进制,其二进制数都会比上一个少一个0。那么我们就可以利用这个特性来进行按位与(&)和按位或(|)的操作,来达到多个值的组合和判断。
public class Main {
private static final int A = 0x10000000;
private static final int B = 0x20000000;
private static final int C = 0x40000000;
public static void main(String[] args) {
// A的值
System.out.println("A= "+Integer.toBinaryString(A));
// B的值
System.out.println("B= "+Integer.toBinaryString(B));
// C的值
System.out.println("C= "+Integer.toBinaryString(C));
// 演示按位或(|)
int flag0 = A|B|C;
// 输出结果:1110000000000000000000000000000
System.out.println(Integer.toBinaryString(flag0));
// 判断是否存在A
int flag1 = B|C;
// 输出结果:false
System.out.println((flag1 & A) == A);
// 清除A
int flag2 = A|B|C;
flag2 &= ~A;
// 输出结果:1100000000000000000000000000000
System.out.println(Integer.toBinaryString(flag2));
}
}
通过上面的代码和输出结果,可以发现
1.按位与(&)可以判断多值中有没有该值
(flag1 & A) == A // true代表flag1中有A,false代表flag1中没有A
(flag1 & A) == 0 // 如果为0代表flag1中没有A这个值
2.按位或(|)和&=~分别是添加值和清除该值
boolean pressed = false;
if (pressed)
{
flag0 |= A; // 添加A
}
else
{
flag0 &= ~A; // 只清除A
}
这些技巧可以用到实际开发中即可以存储多个值也可以简化判断。