iT邦幫忙

2023 iThome 鐵人賽

DAY 5
0
Software Development

東漂見習生教你 C 語言系列 第 5

【DAY 05】: 數字運算&位元運算

  • 分享至 

  • xImage
  •  

おはよう,今天是第五天,那今日的目標就是要跟大家來說一下數字運算和位元運算 !

數字運算

數字運算就像是一般我們在算數學時會用到的加減乘除和取餘數,那這些我們都統稱為算術運算子。

加法

加法 (addition),就是兩變數相加,符號 +
用整數舉例:

#include <stdio.h>
int main(){
    int a = 1;
    int b = 30;
    int ans;
    
    ans = a + b;
    printf("a + b = %d\n",ans); // 輸出 a + b 的結果 31 (ans)
}

減法

減法 (subtraction),就是兩變數相減,符號 -
用浮點數舉例:

#include <stdio.h>
int main(){
    float c = 2.43;
    float d = 0.61;
    float ans;
    
    ans = c - d;
    printf("c - d = %f\n",ans); // 輸出 c - d 的結果 1.820000 (ans)
}

那你/妳一定覺得奇怪,為甚麼都是到小數點後第六位呢?
因為這是預設的樣子~

乘法

乘法 (multipilcation),就是兩變數相乘,符號 *
用整數舉例:

#include <stdio.h>
int main(){
    int e = 253;
    int f = 271;
    int ans;
    
    ans = e * f;
    printf("e * f = %d\n",ans); // 輸出 e * f 的結果 68563 (ans)
}

除法

除法 (division),就是兩變數相除,符號 /
用浮點數舉例:

#include <stdio.h>
int main(){
    float g = 3.6;
    float h = 2.0;
    float ans;
    
    ans = g / h;
    printf("g - h = %f\n",ans); // 輸出 g / h 的結果 1.800000 (ans)
}

如果是整數除以整數的話,它的結果會是無條件捨去到個位數喔 !

取餘數

取餘數 (mod) 呢 ? 那就是兩整數相除後取餘數,而且是取整數喔 !,符號 %
只能用整數舉例:

#include <stdio.h>
int main(){
    int i = 24;
    int j = 5;
    int ans;
    
    ans = i % j;
    printf("i mod j = %d\n",ans); // 輸出 i % j 的結果 4 (ans)
}

位元運算

今天我們探討的位元運算只涉及整數的部分!因為浮點數的二進位表示不像整數那麼單純,所以我們先暫時不討論 ~
位元運算包含六種操作:

  1. 且運算 (and, &) 兩個位元都是 1,輸出才會是 1
  2. 互斥或運算 (xor, ^) 兩個位元相同為 0,不同為 1
  3. 或運算 (or, |) 兩個位元任一為 1,輸出就會是 1
  4. 反運算 (not, ~) 反正就是 1 變 0,0 變 1 (就真的有點難解釋,你/妳懂得吧!)
  5. 位元右移 (right shift, >>) 就是快速版本的除以 2 後無條件捨去到個位數
  6. 位元左移 (left shift, <<) 就是快速版本的乘以 2

那現在來介紹幾種常見的位元運算應用囉 !

  1. 判斷奇偶數 (x & 1)
    1 在二進位整數裡面是 00...01,透過且運算我們可以得到最小位元的值,如果這個數值為 1,那 x 就是奇數;為 0 的話,則是偶數。
    // 判斷奇偶數其實可以透過 mod 來完成,但是 mod 是非常慢的運算,如果改用位元運算,可以大大的提升效率。

  2. 產生 2 的 n 次方 (1 << n)
    2 的 n 次方的特性是只有一個位元是 1,其餘都是 0,所以可以用位元左移搭配 1 來運算。
    舉例 time: 2 的 20 次方就是 1 << 20

  3. 將第 n 個位元設為 1 (x | (1 << n))
    因為要保留 x 的其他位元,所以使用或運算。

  4. 將 x 取負數 (~x + 1)
    這個原理是二補數法。簡單來說,是先做位元反轉在加一。


額外的小推薦 :
老樣子,畢竟是用日文做開頭嘛~
今天推薦的是 Eve - 蒼のワルツ (Youtube : 蒼のワルツ)
喬瑟與虎與魚群的主題曲,真的是一部很棒的作品 QAQ
歡迎有興趣的朋朋們可以去看看,這裡就不爆雷了 ^^
再加碼一首啦,就是 Eve - 心海 (Youtube : 心海)


上一篇
【DAY 04】: 輸出和輸入
下一篇
【DAY 06】: if、else
系列文
東漂見習生教你 C 語言7
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言