# 邏輯運算子
邏輯上共有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,輸出7
0111與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)