为高效使用内存, 无论C++还是java都经常使用到BitMask, 尤其是在View这样的基础类中这种用法更为常见.
一个对象经常存在多种状态,在 Java 中,一个 byte 类型,有 8 位(bit),可以表达 8 个不同的状态,并且“这些状态是互不影响”的。而 int 类型,则有 32 位,可以表达 32 种状态。
BitMask 基本操作
操作分为: 1. 设置状态. 2. 清除状态. 3. 查询状态.
byte mask = 0x01 << 1; //用第二位来记录某个状态, 这个byte变量就是某个状态所对应的mask.
1. 设置状态
xxxx xxxx
OR 0000 0010
= xxxx xx1x
status |= mask;
2. 清除状态
xxxx xxxx
AND 1111 1101
= xxxx xx0x
status &= ~mask
3. 查询状态
xxxx xxxx
AND 0000 0010
= 0000 00x0
(status&mask), 结果>0代表状态为on, ==0代表状态为off.
boolean isOn = (status & mask) > 0;
在看优秀代码时, 看到|=, &= ~, (status & mask) > 0的时候就可以立刻反映过来是这行代码的目的是设置状态, 清除状态还是查询某个状态, 提高我们阅读代码的理解能力.
demo:
//file: PopupWindowExtend.java
private int computeFlags(int curFlags) {
//目的是清除下面的这些状态
curFlags &= ~(
WindowManager.LayoutParams.FLAG_IGNORE_CHEEK_PRESSES |
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE |
WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE |
WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH |
WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS |
WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
//下面是根据这些成员变量, 去设置这些状态.
if(mIgnoreCheekPress) {
curFlags |= WindowManager.LayoutParams.FLAG_IGNORE_CHEEK_PRESSES;
}
if (!mFocusable) {
curFlags |= WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
if (mInputMethodMode == INPUT_METHOD_NEEDED) {
curFlags |= WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM;
}
} else if (mInputMethodMode == INPUT_METHOD_NOT_NEEDED) {
curFlags |= WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM;
}
if (!mTouchable) {
curFlags |= WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE;
}
if (mOutsideTouchable) {
curFlags |= WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH;
}
if (!mClippingEnabled) {
curFlags |= WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS;
}
return curFlags;
}
refer to : http://geek.csdn.net/news/detail/73343