圖片檔由此下載:

https://imgur.com/a/YcmKrbk

按我開啟

 

先備知識:C語言運算符號使用 (如%) 以及迴圈 (for)

 

#include<stdio.h>
int main(void)
{
 問題:如何換算十進位數,到二進位數?

 >> Step_0:先備知識

 十進位: 27549 --> 2*10000 + 7*1000 + 5*100 + 4*10 + 9*1 底數是10
 二進位: 10111 --> 1*(24) + 0*(23) + 1*(22) + 1*(21) + 1*(20) 底數是2

 留意兩者的相似性,十進位的底數都是 10n,而二進位是 2n
 如果要得到 5 ,省略掉前面更大的數,然後除以 100

 >> Step_1:如何拆解十進位,得到每個位數? (兩種解決方法)

 直觀上 - 方法_1:
 int x = 27549;
 int a, b, c, d, e;
 a = x / 10000; --> 2
 b = (x % 10000)/1000; --> 7
 c = (x % 1000)/100; --> 5
 d = (x % 100)/10; --> 4
 e = (x % 10)/1; --> 9

 較不直觀 - 方法_2:
 int x = 27549;
 int a, b, c, d, e;
 e = x % 10; 27549 % 10 --> 9
 d = (x /10) % 10; 2754 % 10 --> 4
 c = (x /100) % 10; 275 % 10 --> 5
 b = (x /1000) % 10; 27 % 10 --> 7
 a = (x /10000) % 10; 2 % 10 --> 2

 一個是改變除數,另一個是改變被除數,
 方法_2 比較不直觀,但搭配 for 時比較好寫一點點


 >> Step_2:進入到 for 迴圈!

 方法_1:
 int x = 27549;
 int i, k, pow = 1;
 for (i=1; i<=5; i++){
 k = x % (pow*10) /pow; pow從 1 開始除, k 會依序得到結果
 pow *= 10;
 }
 對照前面的作法,不過是顛倒過來從小的開始做起
 註:第44行不需要加( ),因為 % 和 / 是由左到右執行

 方法_2:
 int x = 27549;
 int i, k;
 for (i=1; i<=5; i++){
 k = x % 10;
 x /= 10;
 }
 兩者比較起來,
 方法_2 可以少宣告一個變數,而且文字量比較少,不過就是不太直觀 XD


 >> Step_3:那二進位呢?

 其實非常簡單,只是底數的轉換而已,把上面的 10 改成 2 就好了

 方法_1:
 int x = 27549;
 int i, k, pow = 1;
 for (i=1; i<=31; i++){
 k = x % (pow*2) /pow;
 pow *= 2;
 }

 方法_2:
 int x = 27549;
 int i, k;
 for (i=1; i<=31; i++){
 k = x % 2;
 x /= 2;
 }
 這裡 i 一直跑到 31 ,是因為不確定轉換成二進位會有多少位數,所以取到 230

 return 0;
}

 

文章標籤
全站熱搜
創作者介紹
創作者 Davidhu127 的頭像
Davidhu127

I Stand Up For Myself

Davidhu127 發表在 痞客邦 留言(0) 人氣(56,116)