# 運算子們
是時候展現各位的**數學邏輯**能力了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 |
---
## 比較運算子

---
## 邏輯運算子
| 運算 | 運算子 | 例子 |
| ---- |:------:| ---------- |
| 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$運算:

答案為:358
:::info
左移 $k$ 位等價於乘上 $2^k$。
:::
### 右移
每個位元進行左移。
舉例:
整數 $179>>1$運算:

答案為:$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
```
---
### 運算子優先順續

---
## 補充:數學函式
需引入`<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: `中和高中`