Android中的位运算

文章目录

  • 位运算

近期在阅读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
        }

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

你可能感兴趣的:(Java学习,Android源码研习,android学习)