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