今天復習C語言的時候,看到位運算這章。記得以前學習C語言的時候,都沒怎么關注這一章。只是記得幾個位運算符,&:按位與,|:按位或,^:按位異或,~:取反,<<:左移,>>:右移,知道其中的含義罷了。不過當看完這一章,確實是受益匪淺。尤其是利用”異或“運算,實現交換兩個值,而不用臨時變量。
通常我們交換兩個值,都是用一個臨時的變量temp,拿交換a,b的值為例,通常的做法是:temp = a;a = b;b = temp;不過利用位運算,真的是方便很多:
假如 a = 3,b = 4。想將a和b的值互換,可以用一下賦值語句實現:
a = a ^ b;
b = b ^ a;
a = a ^ b;
下面用豎式進行簡單說明:(10進制化為二進制)
a = 011
(^) b = 100
則 a = 111(a ^ b的結果賦值給a,a已變成了7)
(^) b = 100
則 b = 011(b^a的結果賦給b,b已經變成了3)
(^) a = 111
則 a = 100(a^b的結果賦給a,a已經變成了4)
從上面的豎式可以清楚的看到利用異或運算實現兩個值交換的基本過程。
下面從深層次剖析一下:
1.對于開始的兩個賦值語句,a = a ^ b,b = b ^ a,相當于b = b ^ (a ^ b) = a ^ b ^ b,而b ^ b 顯然等于0。因此b = a ^ 0,顯然結果為a。
2. 同理可以分析第三個賦值語句,a = a ^ b = (a ^ b) ^ a = b
注:1.^ 即”異或“運算符。它的意思是判斷兩個相應的位值是否為”異“,為”異"(值不同)就取真(1);否則為假(0)。
2.^運算符的特點是與0異或,保持原值;與本身異或,結果為0。