1. 程式人生 > 其它 >c語言手動實現十進位制數轉換為二進位制數。_學點演算法(七)——十進位制數轉換為二進位制數...

c語言手動實現十進位制數轉換為二進位制數。_學點演算法(七)——十進位制數轉換為二進位制數...

技術標籤:c語言手動實現十進位制數轉換為二進位制數。

今天我們來學習十進位制轉為二進位制的演算法。

大家學習計算機或者程式設計,都會知道計算機處理資料都是基於二進位制的,而我們在日常生活中都是使用十進位制。如果要用計算機儲存資料,肯定要將十進位制轉化為二進位制,或者我們要查資料,要將二進位制轉換為十進位制,那麼問題來了:現在有一個十進位制數,我們如何將其轉換為二進位制數呢?

比如我們現在有一個數字:1024(預先給定的數字預設用十進位制理解)。用十進位制表示為:

c0081e10281e7792b6677d183692c93a.png

1024的十進位制表示

用二進位制可表示為:

186250331be11adbad102c9f18b03414.png

1024的二進位制表示

可以發現一個規律:十進位制或者二進位制的最終表示形式1024或10,000,000,000可以取展開式的係數得到,而這個展開式公式裡面的數字都是以十進位制表示的。我們只要取到這些係數就可以得到二進位制數的表示,那麼我們如何取到這些係數呢?

為了簡便和易於理解,我們以十進位制來分析,可以發現,最後一項值是4,10的指數是0,即最後一項值本身就是係數本身,而展開式的其他項的指數都大於等於1,即意味著它們都可以被10整除,那麼最後一項就是整體值除以10後留下的餘數,即係數。通過除10取餘的方法,我們可以得到最後一項的係數4,那麼如何取到倒數第二項的係數呢?很簡單,除以兩次10就得到了倒數第二項的係數。其他項係數可以通過同樣的方法取到。那麼什麼時候結束呢?就是我們取不到任何係數的時候,就是我們上一次除完10得到的商為0,即表示最後一個係數被我們取到了,整個過程宣告終止。

整體流程如下:

①取倒數第一個係數:

6f42997e4faf94cecca81139bad23b3a.png

②取倒數第二個係數:

7c1082c496f2bfa2500033d475739231.png

③取倒數第三個係數:

2a0e0fd58781a8b4de5a438c344261b8.png

④取倒數第四個係數:

019e9aee556571352e8d5ddf112e032d.png

這時,商變成了0,整個過程終止。

而最終得到數即是把每一步得到的數反過來排列,4201反過來即是1024。

二進位制的原理同十進位制,只是把每個過程的除數換成2即可。

注意到我們將每輪求得的結果值反過來排列才是最後的結果值,這種逆序輸出的性質剛好對應了棧的後進先出的特性。索引我們可以使用棧來儲存計算過程中求得的係數,所有係數求解完畢後再逆序輸出即可。

程式碼實現如下:

/** * 十進位制轉為二進位制 * * @return 十進位制數對應的二進位制數 */public static String decimal2BinaryString(int decimal) {    // 如果十進位制為0,則直接返回0    if (decimal == 0) {        return "0";    }    // 使用棧來儲存先求出來的係數    Deque stack = new ArrayDeque<>();    int r = decimal;    int m;    while (r != 0) {        // 求當前最後一個係數        m = r % 2;        // 求當前商,並賦值回r,做下一輪運算        r = r >> 1;        // 將當前係數儲存到棧中        stack.push(m);    }    // 依次將儲存在棧中的資料取出,拼接成二進位制    StringBuilder builder = new StringBuilder(stack.size());    while (!stack.isEmpty()) {        builder.append(stack.pop());    }    // 返回二進位制字串    return builder.toString();}

測試程式碼如下:

System.out.println(decimal2BinaryString(1024));

輸出結果如下:

10000000000

符合我們的預期。