概述

在编程过程中发现有很多源码里面会定义 1,2,4,8 等这样的常量,比如说 Android 的 ActionBar 关于显示的常量:

android.app.ActionBar
1
2
3
4
public static final int DISPLAY_USE_LOGO = 0x1;
public static final int DISPLAY_SHOW_HOME = 0x2;
public static final int DISPLAY_HOME_AS_UP = 0x4;
public static final int DISPLAY_SHOW_TITLE = 0x8;

为什么会这样设计呢?下面告诉你.

使用按位运算操作 1,2,4,8

  • 使用按位或(|) 叠加参数
1
getActionBar().setDisplayOptions(ActionBar.DISPLAY_USE_LOGO | ActionBar.DISPLAY_SHOW_HOME);

这里 ActionBar.DISPLAY_USE_LOGO | ActionBar.DISPLAY_SHOW_HOME的值为 3, 所以DISPLAY_HOME_AS_UP不能为 3, 值为 4 是个不错的选择. 一般来说我们程序中会使用 2 的 n 次幂来作为相关常量的值,如 1,2,4,8,32,64…

  • 使用按位与(&) 检查是否包含
1
2
3
public boolean hasOption(int option) {
return ((mDisplayOptions & option) != 0);
}
  • 使用按位异或(^) 删除某个值
1
2
3
4
5
public boolean removeOption(int option) {
if (hasOption(option)) {
mDisplayOptions = mDisplayOptions ^ option;
}
}
  • 使用按位异或(&)+按位取反(~) 也可删除某个值
1
2
3
public boolean removeOption(int option) {
mDisplayOptions = mDisplayOptions & (~option);
}

总结

学计算机基础的时候,老师也没有介绍按位的用法. 工作中才发现其中的神奇之处, 是不是很神奇呢? 在你的程序中也用上这样的设计吧~~