1. 程式人生 > >與&、或|、異或^ 不一樣的運用(交換位置、二進位制存取資料)

與&、或|、異或^ 不一樣的運用(交換位置、二進位制存取資料)

兩個數交換位置: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就是沒放進盒子裡面。
手機號 郵箱 身份證 地址 緊急聯絡人 微信 QQ 銀行卡
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 0010QQ
0000 0100:微信
0000 1000:緊急聯絡人
0001 0000:地址
0010 0000:身份證
0100 0000:郵箱
1000 0000:手機號

那麼轉化為上面的格子的圖,是不是就是這樣。

手機號 郵箱 身份證 地址 緊急聯絡人 微信 QQ 銀行卡
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

至此,使用二進位制來儲存資料就完整結束了,有更好的想法,更多的見解,更妙的猜想,更深的疑惑……歡迎評論,我們討論、互相學習。