# 邏輯運算子

邏輯上共有 3 種運算子, AND OR NOT

符號解釋
&&AND 且
||OR 或
!NOT 反轉

這 3 種運算子回傳的結果是 bool 型態,也就是 truefalse ,cout 出來則是 10

cout << 1 && 1;  
cout << 1 && 0;
cout << 0 && 1;
cout << 0 && 0;
// 印出 1 0 0 0
cout << 1 || 1;  
cout << 1 || 0;
cout << 0 || 1;
cout << 0 || 0;
// 印出 1 1 1 0
cout << !1;  
cout << !0;
// 印出 0 1
  • AND 運算子需要兩邊皆為 true ,才會輸出 true
  • OR 運算子只要一邊為 true ,則結果為 true
  • NOT 則會將 truefalsefalsetrue

對任何變數或運算,只要值非零,則視為 true ;值為零,則視為 false


# 關係運算子

C++ 提供了關係運算子,類似於數學的比較運算
關係運算子同樣是用來判斷 truefalse 的運算子

符號解釋
>大於
>=不小於
<小於
<=不大於
==等於
!=不等於

cout << 1 > 5;
cout << 1 >= 5;
cout << 1 < 5;
cout << 1 <= 5;
cout << 1 == 5;
cout << 1 != 5;
// 印出 0 0 1 1 0 1

這邊的 == 是條件判斷,判斷兩個值相不相等,而不是 = 賦值的意思


# 位元運算子

位元運算是根據數位設計上的邏輯,也就是它會將值轉為 2 進位進行運算
同樣有 AND OR XOR 等運算子

先來一個範例 cout << 7 & 4; 會輸出多少?
7 的 2 進位為 0111
4 的 2 進位為 0100
AND 運算結果為 01000100 為 4 的 2 進位,所以輸出結果為 4


以下為常見的位元運算:

符號解釋
&AND
|OR
^Xor
<<left shift 左移
>>right shift 右移

cout << 7 & 4;
cout << 7 | 4;
cout << 7 ^ 4;
cout << (7 << 1);
cout << (7 >> 1);
// 印出 4 7 3 14 3

01110100 進行 OR 運算,結果為 0111 ,輸出 7
01110100 進行 XOR 運算,結果為 0011 ,輸出 3
(詳細的 XOR 位元運算,可以參考這篇)

前三個沒什麼問題,就是將值轉為 2 進位後進行運算
而後兩個稱為左 (右) 移運算子

  1. 7 << 1 的意思是將 7 的 2 進位往左邊移動一格
    7 的 2 進位 0111 ,左移變成 1110 (缺項補 0),於是輸出 14
  2. 7 >> 1 右移的概念也一樣
    7 的 2 進位 0111 ,右移變成 0011 (缺項補 0),於是輸出 3

# 利用位元運算子加速運算

  • 如果要乘上一個 2 的倍數,能改用左移運算子加速
    x *= 2; 相當於 x << 1
    x *= 32 相當於 x << 5

  • 如果要除上一個 2 的倍數,能改用右移運算子加速
    x /= 2; 相當於 x >> 1
    x /= 32 相當於 x >> 5

  • 交換兩個數字
    一般寫法:
// swap(x, y)
int x, y, tmp;
tmp = x;
x = y;
y = tmp;

利用 XOR 運算子加速:

// swap(x, y)
int x, y;
x ^= y;
y ^= x;
x ^= y;

  • 如果要取 2 的倍數的餘數,能改用 AND 運算子加速
    x = 55 / 2; 相當於 x = 55 & (2 - 1)
    x = 78 / 8; 相當於 x = 78 & (8 - 1)