與&、或|、異或^ 不一樣的運用(交換位置、二進位制存取資料)
阿新 • • 發佈:2019-01-04
兩個數交換位置:int a = 1;int b = 2;如何交換ab兩個變數的值?
①使用第三個變數來接收
int c = 0;
c = a; //c 等於1
a = b; // a 等於2
b = c; // b 等於1
當然靈活運用,這種方式肯定是不推薦的啦!
②重新整理一下你對小學數學的理解
a = a + b; // a 等於3
b = a - b; // b 等於1
a = a - b; // a 等於2
③既然是程式設計師,我們用程式設計師的方式來做一下,還可以深刻理解一下^
//如果m、n兩個值不相同,則異或結果為1。如果m、n兩個值相同,異或結果為0。
//1 的二進位制 : 0000 0001
//2 的二進位制 : 0000 0010
//3 的二進位制 : 0000 0011
a = a ^ b; // a 等於 1 ^ 2 = 0000 0011 = 3
b = a ^ b; // b 等於 3 ^ 2 = 0000 0001 = 1
a = a ^ b; // a 等於 3 ^ 1 = 0000 0010 = 2
是不是很奇妙。下面看一個一樣奇妙的與& 、 或 | 的操作。
- 我們經常會遇到需要存一組boolean值得時候,這些值有個特點,便是隻有兩種情況,要麼true、要麼false,或者說要麼正確、要麼錯誤,在或者說要麼0,要麼1。ok,就是這個01,也就是今天的主角,二進位制。
逢二進一,借一當二
我們也可以把二進位制想成一個盒子,一個容器,裡面裝的便是你要儲存的boolean值。舉個栗子,後臺認證的時候,使用者手機號是否認證,郵箱是否認證,是否實名認證,地址是否填了,緊急聯絡人是否填了,微信是否認證,QQ是否繫結,銀行卡是否繫結……
那麼這個二進位制容器就可以來裝這些資料了,1就是已經放進盒子裡面了,0就是沒放進盒子裡面。
手機號 | 郵箱 | 身份證 | 地址 | 緊急聯絡人 | 微信 | 銀行卡 | |
---|---|---|---|---|---|---|---|
1 | 0 | 1 | 0 | 1 | 0 | 1 | 1 |
- 下面講解程式碼上怎麼展現:
講之前先說& | 的用法吧
二進位制中
- 兩個數都為1,&的值才為1,否則為0
即數學中的同時成立,條件才成立 - 兩個數都為0,|的值才為0,否則為1
即數學中的任意一個成立,條件便成立
好,現在進入正題
int bankCard = 1 ;
int QQ = 2 << 0;
int weChat = 2 << 1;
int person = 2 << 2;
int idCard = 2 << 3;
int addr = 2 << 4;
int email = 2 << 5;
int phone = 2 << 6;
在將上面的這些值轉換為二進位制的數:
//不一定是8位的二進位制資料,只是演示,節目效果
0000 0001:銀行卡
0000 0010:QQ
0000 0100:微信
0000 1000:緊急聯絡人
0001 0000:地址
0010 0000:身份證
0100 0000:郵箱
1000 0000:手機號
那麼轉化為上面的格子的圖,是不是就是這樣。
手機號 | 郵箱 | 身份證 | 地址 | 緊急聯絡人 | 微信 | 銀行卡 | |
---|---|---|---|---|---|---|---|
1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
如果認證了手機號,就在手機號裡面填1,沒認證就是0,其他的也一樣。
- 向格子插入資料的時候:
int state= 0;
state = state | phone ;
·····························解析·····························
//0000 0000 ——>state開始時候的二進位制
//1000 0000 ——>phone的二進位制
//1000 0000 ——>|(或)運算結果,state變成了1000 0000,從而實現儲存
//實現了phone的存入,其他資料類似,
- 從格子查詢資料的時候:
int state = 10;
phone = state & phone;
·····························解析·····························
//state為任意值,為了驗證有繫結的,也有沒繫結的,所以取個10。
//0000 1010 ——>state=10的二進位制
//1000 0000 ——>phone二進位制
//0000 0000 ——>&(與)結果為0,說明還沒有繫結手機
---------------------------------------------------------------
QQ = state & QQ ;
·····························解析·····························
//0000 1010 ——>state=10的二進位制
//0000 0010 ——>QQ二進位制
//0000 0010 ——>&(與)結果為 2 << 0,即QQ的二進位制,說明已經綁定了QQ
綜上所述,只要判斷state&<變數名>是否為0,即可得出是否繫結
這樣可存可取,是不是比原來宣告8個boolean型別的變數要好呢?在我們閱讀原始碼的時候也經常會遇到這樣的存取方式,瞭解便好!
另外,還有一種情況,就是已經綁定了手機號,但是需要取消繫結,這個時候使用&|就不能達到需求了。這個時候就需要上面講過的^。
還用state=10來舉例子,已知10裡面存入了‘QQ’和‘緊急聯絡人’,看看怎麼取消QQ的繫結。
int state = 10 ;
state = state ^ QQ ;
·····························解析·····························
//0000 1010 ——>state=10的二進位制
//0000 0010 ——>QQ二進位制
//0000 1000 ——>^(異或)結果為2<<2,表示state僅剩緊急聯絡人,成功取消QQ
至此,使用二進位制來儲存資料就完整結束了,有更好的想法,更多的見解,更妙的猜想,更深的疑惑……歡迎評論,我們討論、互相學習。