圖片檔由此下載:

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*(2^4) + 0*(2^3) + 1*(2^2) + 1*(2^1) + 1*(2^0)  底數是2

        留意兩者的相似性,十進位的底數都是 10^n,而二進位是 2^n
        如果要得到 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 ,是因為不確定轉換成二進位會有多少位數,所以取到 2^30

    return 0;
}

 

arrow
arrow

    Davidhu127 發表在 痞客邦 留言(1) 人氣()