---
# System prepended metadata

title: 運算子們
tags: [中和高中]

---

# 運算子們
是時候展現各位的**數學邏輯**能力了OUO

## 數學運算子
沒錯就是\+\-*/
只是多了%(取餘運算子)


| 運算 | 運算子 | 例子  |
| ---- | ------ |:-----:|
| 加法 | +      | i + 9 |
| 減法 | -      | a - c |
| 乘法 | *      | a * b |
| 除法 | /      | x / y |
| 餘數 | %      | r % s |

舉例:
```c=
#include <stdio.h>
int main(){
    printf("%d\n", 5+3);
    printf("%d\n", 5-3);
    printf("%d\n", 5*3);
    printf("%d\n", 5/3);
    printf("%d\n", 5%3);
    return 0 ;
}
```
輸出
```
8
2
15
1
2
```

:::info
第六行為甚麼是輸出1 而不是1.666..?
:::

因為在C/C++的編譯器當中，型態為整數但丟進去是浮點數時會無條件捨去，所以要改一下程式碼

```c=
#include <stdio.h>
int main(){
    printf("%d\n", 5+3);
    printf("%d\n", 5-3);
    printf("%d\n", 5*3);
    printf("%f\n", (float)5/3);
    printf("%d\n", 5%3);
    return 0 ;
}
```

輸出

```
8
2
15
1.666667
2
```
---
數學運算子中還有一些小群體
如:


| 運算 | 運算子 | 例子       |
| ---- |:------:| ---------- |
| 遞增 |   ++   | a++ or ++a |
| 遞減 |   --   | a-- or --a |

`a++` =   `a=a+1`
`a--` =   `a=a-1`

放前面跟放後面有什麼差?

舉例:
```c=
#include <stdio.h>
int main(){
    int a=10;
    int b=10;
    printf("%d\n",a++);
    printf("%d",++b);
    return 0 ;
}
```
照理來說輸出應該兩個都是11，但輸出並不是這樣。

輸出:
```
10
11
```

怎麼上面是10，下面是11

原因是放後面代表會先執行程式在加1
放前面會先加1再執行程式

---



| 運算     | 運算子 |      例子      |
| -------- | ------ |:--------------:|
| 指派     | =      |     i = 50     |
| 加法指派 | +=     | i += 9 //i=i+9 |
| 減法指派 | -=     | i -= 9 //i=i-9 |
| 乘法指派 | *=     | i *= 9 //i=*9  |
| 除法指派 | /=     | i /= 9 //i=i/9 |
| 餘數指派 | %=     | i %= 9 //i=i%9 |




---

## 比較運算子
![](https://i.imgur.com/oncgtTt.png)


---
## 邏輯運算子



| 運算 | 運算子 | 例子       |
| ---- |:------:| ---------- |
| AND     |   &&     |    (x>0)&&(y>0)        |
| OR |   \|\|  | (a>0)\|\|(b>0) |
| NOT |  !   | !(a>=b) |



這在下一章會常用到

---

## (補充)位元運算子


- AND：`&`
- OR：`|`
- XOR：`^`
- NOT：`~`
- 左移 LEFT-SHIFT：`<<`
- 右移 RIGHT-SHIFT：`>>`

可以用於加速

---

### AND

對每個位元進行 AND 運算。AND 僅在兩個位元皆為 $1$ 時，運算結果為 $1$。

舉例:
兩個整數 $9 = 1001_2$ 和 $12 = 1100_2$ 進行運算：

$$
\begin{array}{rr}
 &1001\\
\&&1100\\
\hline
 &1000
\end{array}
$$

運算結果為 $1000_2 = 8$。

---

### OR
對每個位元進行 OR 運算。OR 在兩個位元至少有一個為 $1$ 時，運算結果為 $1$。
舉例:
兩個整數 $9 = 1001_2$ 和 $12 = 1100_2$ 進行運算：

$$
\begin{array}{rr}
 &1001\\
|&1100\\
\hline
 &1101
\end{array}
$$

運算結果為 $1101_2 = 13$。

---

### XOR
對每個位元進行 XOR 運算。XOR 在兩個位元相異時，運算結果為 $1$。
舉例:
兩個整數 $9 = 1001_2$ 和 $12 = 1100_2$ 進行運算：

$$
\begin{array}{rr}
 &1001\\
\text{^}&1100\\
\hline
 &0101
\end{array}
$$

運算結果為 $0101_2 = 5$。

---

### NOT
對每個位元進行 NOT 運算。NOT 的運算結果為相異的位元。
舉例:
整數 $9 = 1001_2$進行NOT運算：

$$
\begin{array}{rr}
\text{~}&1100\\
\hline
 &0011
\end{array}
$$

運算結果為 $0011_2 = 3$。


### 左移
每個位元進行左移。
舉例:
整數 $179<<1$運算：
![](https://i.imgur.com/E31zd3o.png)
答案為:358

:::info
左移 $k$ 位等價於乘上 $2^k$。
:::

### 右移
每個位元進行左移。
舉例:
整數 $179>>1$運算：
![](https://i.imgur.com/if05if3.png)

答案為:$89$

:::info
右移 $k$ 位等價於除以 $2^k$
:::

---
### 位元小技巧
* 除以2的時候 //右移 
```c=
//找中間的數
mid = ((left + right) >> 1);
```
:::warning
浮點數不可使用
:::

* 快速計算$2^k$次方 //左移
```c
#include <stdio.h>

int main(){
    printf("%d",1<<10);
    //輸出1024
    return 0 ;
}
```
* 奇偶判斷 //AND

```c=
#include <stdio.h>

int main(){
    //奇偶的影響主要在 2^0 這一位，因此可判斷這一位數決定奇偶。
    int n=10;
    if(n&1){
        printf("odd");
    }else{
        printf("even");
    }
    return 0 ;
}
```
輸出
```
even
```

```c=
#include <stdio.h>

int main(){
    int n=9;
    if(n&1){
        printf("odd");
    }else{
        printf("even");
    }
    return 0 ;
}
```

輸出
```
odd
```

---

### 運算子優先順續
![](https://i.imgur.com/JtGgKCz.png)

---


## 補充:數學函式
需引入`<math.h>`標頭檔
`pow(x,y)`代表$x^y$次方
`sqrt(x)`代表開根號
`abs(x)`回傳x的絕對值

更多內容 : https://www.cplusplus.com/reference/cmath/

---

## 來個練習題
[梯形?](https://chiscoj.com/problem/a004)
[呼拉圈](https://chiscoj.com/problem/a005)
[中和動物園](https://chiscoj.com/problem/a006)



###### tags: `中和高中`