[C#]logic operator and bitwise operator

最近上網查詢了一下這兩者之間的差別,後來發現這個概念很基礎,但我一直沒將它搞清楚,因為過去我大多只用了logic operator來寫程式,在網路上我找到兩篇蠻不錯的說明:
http://www.blackwasp.co.uk/CSharpBooleanOperators.aspx
http://www.blackwasp.co.uk/CSharpLogicalBitwiseOps.aspx

 

經過上次laneser的指教,最近上網查詢了一下這兩者之間的差別,後來發現這個概念很基礎,但我一直沒將它搞清楚,因為過去我大多只用了logic operator來寫程式,在網路上我找到兩篇蠻不錯的說明,首先先看看C#的operator,

http://www.blackwasp.co.uk/CSharpBooleanOperators.aspx

嚴格來說=、!、&、&&、|、||等等都算是logic operator,但&跟&&或者|跟||之間其實是有其差異的,我們先講比較常見的&&跟||,我們在使用的時候常用來做變數比對或者邏輯判斷,如下:

1 if(A && B)  
2 //A跟B都是true  
3 else  
4 //A或B其中之一是false  
5
6 if(A || B)  
7 //A或B其中之一是true  
8 else  
9 //A跟B都是false

 

那&跟|又是什麼東西呢?在程式中我們這樣寫:

1 if(A & B)  
2
3 if(A | B)

很多情況下跟上面的寫法(&&、||)比起來,輸出的結果好像都一樣,如果我們以一般的boolean運算來看的話,或許是這樣,但其實&、|的用途不只這些,回想一下再計算機概論中學到的邏輯閘(AND、OR、XOR)好像是用來作位元的邏輯運算,關於這部分我們參考一下下面這篇:http://www.blackwasp.co.uk/CSharpLogicalBitwiseOps.aspx

其中一個例子是這樣寫的:

1 int deviceConfiguration = 187;   // 10111011  
2 int echoMask = 4;                // 00000100  
3
4 // Set the carrier  
5 int newConfiguration = deviceConfiguration | echoMask;   // Result = 191

 

將數值以二進位的方式作邏輯閘的運算並得出結果,如以上的範例就是將10111011跟00000100做OR,最後得出10111111,換算後就是191了。

就&、|來說,在處理邏輯運算時,會先將值轉成二進位值,false是0,true通常是1,然後再透過邏輯閘來得出結果,所以以&、|跟&&、||來作邏輯判斷時,在某些狀況下會有效率上的差別:

1 bool A = true;  
2 bool B = false;  
3 if(A || B)  
4 //do something  
5
6 if(A | B)  
7 //do something

 

以上面的例子來看,第一個使用了||來運算,只要A為true,其實就不用計算B的結果了,但以|來運算的,必須要將A跟B都轉成二進位值才能判斷是否滿足,這兩者在這種狀況下就有所差異了,但這只是一個小案例,一般我們比較少這樣寫,但兩者確實有所差異。

游舒帆 (gipi)

探索原力Co-founder,曾任TutorABC協理與鼎新電腦總監,並曾獲選兩屆微軟最有價值專家 ( MVP ),離開職場後創辦探索原力,致力於協助青少年培養面對未來的能力。認為教育與組織育才其實息息相關,都是在為未來儲備能量,2018年起成立為期一年的專題課程《職涯躍升的關鍵24堂課》,為培養台灣未來的領袖而努力。