目錄:
1、前言
2、與或非是啥?
3、實戰
4、小結
5、寫在最後
java
在查看源碼中,常常會看到不少這樣的符號「&」、「|」、「~」,咋一看挺高大上;仔細一看,有點懵;再看看,其實就是大學學過的再普通不過的與、或、非。今天小盆友就以簡單的形式分享下,同時也是做爲筆記記錄,等某天忽然懵逼時能夠回來看看,話很少說,開始擼。android
或許,大學上的課,在還沒畢業時就還給老師了,因此咱們先重溫下。程序員
知識點:兩位同時爲「1」,結果才爲「1」,不然爲「0」。微信
運算規則:0&0=0; 0&1=0; 1&0=0; 1&1=1;佈局
System.out.println("0 & 0" + (0 & 0));
System.out.println("0 & 1" + (0 & 1));
System.out.println("1 & 0" + (1 & 0));
System.out.println("1 & 1" + (1 & 1));
複製代碼
其實就是運算的位要徹底同樣,才保持原樣,不然就變爲0。編碼
知識點:只要有一位爲1,其值爲1,不然位0。spa
運算規則:0|0=0; 0|1=1; 1|0=1; 1|1=1;.net
System.out.println("0 | 0 = " + (0 | 0));
System.out.println("0 | 1 = " + (0 | 1));
System.out.println("1 | 0 = " + (1 | 0));
System.out.println("1 | 1 = " + (1 | 1));
複製代碼
其實就是隻要有1,結果就爲1。3d
知識點:若是位爲0,結果是1。若是位爲1,結果是0code
運算規則:~0=1; ~1=0;
System.out.println("~1 = " + ~(1));
System.out.println("~0 = " + ~(0));
複製代碼
很驚喜!很意外!有沒有?!居然不是0和1,這裏不是計算機出問題了,而是涉及到了計算機內部的編碼的問題,是否是想到了大學有一門課叫作《計算機科學導論》。詳細講解能夠查看這裏=>傳送門爲了方便查看,我從文章截了一張圖
逼逼叨了這麼多,其實位運算符的文章不少,這裏其實還少了一個異或運算符,但由於沒有出如今實戰中,因此就不作多餘的操做了。咱們來進行真正的運用吧。
你有沒有在xml中這樣編寫過佈局
android:layout_gravity="bottom|right"
複製代碼
咱們這裏就不用bottom、right在源碼中真實的值,以方便講解
這裏的 bottom 和 right 在位上確定是錯開的,這樣作位運算時,才能同時保存該控件 「居右」和「底部」 的屬性。 什麼叫位上錯開,且看下面代碼。
// 0x001 = 0000 0001
int right = 0x001;
// 0x001 = 0000 0010
int bottom = 0x002;
// 結果 = 0000 0011 = 3
System.out.println("right | bottom = " + (right | bottom));
複製代碼
經過上面的代碼,或許你已經恍然大悟(霧?),其實位錯開是爲了或運算時,進行值的保留。 讓兩個狀態的可以保存在一個屬性中,或許你會問這樣有什麼好處了?我撓了下頭,想到了如下三個好處:
上一小節說的是如何組裝成一個值,要怎麼使用它呢?安卓源碼中怎麼知道咱們設置了 right 這個居右的狀態呢?這個便須要使用 「與」 運算符來 取值。具體操做以下代碼:
int right = 0x001;
int bottom = 0x002;
int top = 0x008;
int state = right | bottom;
System.out.println("是否存在 right = " + ((state & right) == right));
System.out.println("是否存在 top = " + ((state & top) == top));
複製代碼
從上面的代碼很清晰的看出,用 「與」 運算符進行
「取值」。是否是有點小驚喜呢?
或許,你會有這樣的一個疑問,若是我想剔除當前已經包含的一個值,須要怎麼辦?這時候就是「非」和「與」運算符聯合使用的時候了,且看下面代碼
int right = 0x001;
int bottom = 0x002;
int top = 0x008;
int state = right | bottom;
System.out.println("剔除 right 狀態前 " + state);
state &= ~right;
System.out.println("剔除 right 狀態後 " + state);
state &= ~top;
System.out.println("剔除不存在的 top 狀態 " + state);
System.out.println();
複製代碼
是否是有點小激動了呢?哈哈,在安卓源碼中運用挺多,舉個栗子🌰,在ViewGroup中的requestDisallowInterceptTouchEvent方法便有用到,這裏就不一一列舉。 敲黑板啦!!! 爲何上面能作到剔除呢?小盆友手寫了下過程(多年沒寫字,不要噴,哈哈哈哈)
或許還有不少更好玩的用法,但限於小盆友能力有限,文筆也通常般,因此就只能到這啦。若是您有更好或是更有趣的用法,或是本文有不妥之處,請與分享和糾正。編碼使我快樂,哈哈哈。
若是須要更多的交流與探討,能夠經過如下微信二維碼加小盆友好友。