Java学习|Android中的位运算


文章目录

  • 位运算

近期在阅读Android源码中发现了许多与位运算相关的代码,其实以前在使用Intent相关常量的时候也遇到过,但是没有怎么深入了解,今天趁此机会分析一下。
位运算 【Java学习|Android中的位运算】如果你是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 }

这些技巧可以用到实际开发中即可以存储多个值也可以简化判断。

    推荐阅读