# 邏輯運算子
邏輯上共有 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 << 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)