文章目录
- 位运算
近期在阅读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
}
这些技巧可以用到实际开发中即可以存储多个值也可以简化判断。
推荐阅读
- Android修改系统的默认日期(Spreadturm)
- ObjectAnimator的使用
- android学习——AsyncTast 异步操作和 ProgressBar
- ace File-Input实现图片上传功能+colorBox显示图片
- Android学习|Android Studio快捷键提高工作效率的奇技
- java学习|【算法学习】链表数相加(Java)
- LinearLayout中动态添加Fragment不能填充整个Activity的问题
- Java学习|ArrayList源码浅析
- Java学习|HashMap浅析
- android学习|TouchDelegate的用法