Android設置變量值之——與或非(&、|、~)

https://github.com/NieJianJian/AndroidNotes,內容將持續更新,歡迎star。


Android常用與或非來添加和判斷變量,比如,Window.java類中的一些變量:

public static final int FEATURE_NO_TITLE = 1;
public static final int FEATURE_PROGRESS = 2;
public static final int FEATURE_LEFT_ICON = 3;
public static final int FEATURE_RIGHT_ICON = 4;
public static final int FEATURE_INDETERMINATE_PROGRESS = 5;
public static final int FEATURE_CONTEXT_MENU = 6;
public static final int FEATURE_CUSTOM_TITLE = 7;
public static final int FEATURE_ACTION_BAR = 8;

上述爲一些常量,如果我們想設置Activity爲沒有title的風格,就需要在Activity中如下調用:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_NO_TITLE); // 1
    setContentView(R.layout.activity_main);
}

添加註釋1處的代碼,就可以設置設置沒有title,具體會在Window.java中設置:

private int mFeatures;
public boolean requestFeature(int featureId) {
    final int flag = 1<<featureId;
    mFeatures |= flag;
    mLocalFeatures |= mContainer != null ? (flag&~mContainer.mFeatures) : flag;
    return (mFeatures&flag) != 0;
}

mFeatures是一個int類型的變量。

此時,我們傳遞到requestFeature中的參數爲FEATURE_NO_TITLE,所以:

flag = 1 << featureId;
等價於 :flag = 1 << FEATURE_NO_TITLE;
等價於 :flag = 1 << 1;
等價於 :flag = 2// 二進制的 10

然後調用:

mFeatures |= flag;
等價於: mFeatures |= 2;
等價於: mFeatures = 2// 二進制10

如果在設置其他的效果,比如添加FEATURE_CONTEXT_MENU,

flag = 1 << featureId;
等價於 :flag = 1 << FEATURE_CONTEXT_MENU;
等價於 :flag = 1 << 6;
等價於 :flag = 64// 二進制的 1000000

然後調用:

mFeatures |= flag;
等價於: mFeatures = mFeatures | flag;
等價於: mFeatures = 2 | 64; 
等價於: mFeatures = 66// 二進制的1000010 

如果還想設置一個FEATURE_LEFT_ICON:

flag = 1 << featureId;
等價於 :flag = 1 << FEATURE_LEFT_ICON;
等價於 :flag = 1 << 3;
等價於 :flag = 8// 二進制的 1000

然後調用:

mFeatures |= flag;
等價於: mFeatures = mFeatures | flag;
等價於: mFeatures = 66 | 8; 
等價於: mFeatures = 74// 二進制的1001010 

此時,mFeatures的值爲74,等價於二進制的:

1001010 

設置該mFeatures的參數有什麼意義呢?主要是用來做一些判斷:

比如,判斷我們當前有沒有設置FEATURE_NO_TITLE,可以執行下面的操作:

boolean b = (mFeatures & (1 << FEATURE_NO_TITLE)) != 0

上述的代碼,等價於:

74 & 1 << 1

等價於二進制的如下兩個數相與:

1001010
0000010

上述兩個二進制的與的結果爲0000010,也就是2,即不爲0是滿足的。

同理,我們要判斷當前有沒有設置FEATURE_RIGHT_ICON,可以執行下面的操作:

boolean b = (mFeatures & (1 << FEATURE_RIGHT_ICON)) != 0

等價於二進制的如下兩個數相與:

1001010
0100000

上述兩個二進制數相與的結果爲0,所以當前沒有設置FEATURE_RIGHT_ICON參數。


如果想要清除FEATURE_CONTEXT_MENU設置,該如何操作?那就是使用~

mFeatures &= ~(1 << FEATURE_CONTEXT_MENU)

上述代碼等價於:

mFeatures &= ~(1 << 6)

等價於:

mFeatures = mFeatures & ~64

此時,~64爲:

~1000000

執行"~"操作後,等價於:

0111111

本身我們將二進制的第7位,設置位1,就代表了此時設置了FEATURE_CONTEXT_MENU,如果我們執行"~"操作,也就將該位置爲0,也就等於清除了該設置。

隨後在對mFeatures進行設置:

mFeatures & ~64

等價於如下的二進制執行"&"操作:

1001010
0111111

結果爲:

mFeatures = 10// 二進制1010

由於對FEATURE_CONTEXT_MENU設置進行"~“操作,保證了對應的設置位爲0,不管之前的這個位置是0還是1,進行”&“操作,結果都爲0,保證了清除該設置位。然後其他位全部位1,進行”&"操作後,其他位是什麼還是什麼,所以,就保證了其他設置位不變,清除了相應的設置。


總結

  • 添加一個變量設置,使用"或"("|")符號

    mFeatures |= flag
    
  • 判斷是否包含某個變量設置,使用"與"("&")符號,判斷結果是否等於0。

    (mFeatures & flag) != 0
    

    判斷是否包含多個變量中的一個或者多個

    (mFeatures & (flag1 | flag2 | flag3)) != 0
    
  • 清除某個變量設置,使用"與 非"("& ~")

    mFeatures & ~flag
    
  • Java中將int值轉換爲二進制的輸出,執行如下代碼:

    System.out.println(Integer.toBinaryString(100));
    
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章