# 邏輯運算子
邏輯上共有 3 種運算子, AND OR NOT
| 符號 | 解釋 |
|---|---|
&& | AND 且 |
|| | OR 或 |
! | NOT 反轉 |
這 3 種運算子回傳的結果是 bool 型態,也就是 true 或 false ,cout 出來則是 1 與 0
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 則會將
true變false,false變true
對任何變數或運算,只要值非零,則視為 true ;值為零,則視為 false
# 關係運算子
C++ 提供了關係運算子,類似於數學的比較運算
關係運算子同樣是用來判斷 true 或 false 的運算子
| 符號 | 解釋 |
|---|---|
> | 大於 |
>= | 不小於 |
< | 小於 |
<= | 不大於 |
== | 等於 |
!= | 不等於 |
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 運算結果為 0100 , 0100 為 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 |
0111 與 0100 進行 OR 運算,結果為 0111 ,輸出 70111 與 0100 進行 XOR 運算,結果為 0011 ,輸出 3
(詳細的 XOR 位元運算,可以參考這篇)
前三個沒什麼問題,就是將值轉為 2 進位後進行運算
而後兩個稱為左 (右) 移運算子
7 << 1的意思是將 7 的 2 進位往左邊移動一格
7 的 2 進位0111,左移變成1110(缺項補 0),於是輸出 147 >> 1右移的概念也一樣
7 的 2 進位0111,右移變成0011(缺項補 0),於是輸出 3
# 利用位元運算子加速運算
- 如果要乘上一個 2 的倍數,能改用左移運算子加速
x *= 2;相當於x << 1x *= 32相當於x << 5
- 如果要除上一個 2 的倍數,能改用右移運算子加速
x /= 2;相當於x >> 1x /= 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)