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));