# 邏輯運算子

邏輯上共有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)