为什么要使用 BitMask

为高效使用内存, 无论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

你可能感兴趣的:(为什么要使用 BitMask)