今天我們來學習十進制轉為二進制的算法。
大家學習計算機或者編程,都會知道計算機處理數據都是基于二進制的,而我們在日常生活中都是使用十進制。如果要用計算機存儲數據,肯定要将十進制轉化為二進制,或者我們要查數據,要将二進制轉換為十進制,那麼問題來了:現在有一個十進制數,我們如何将其轉換為二進制數呢?
比如我們現在有一個數字:1024(預先給定的數字默認用十進制理解)。用十進制表示為:
1024的十進制表示
用二進制可表示為:
1024的二進制表示
可以發現一個規律:十進制或者二進制的最終表示形式1024或10,000,000,000可以取展開式的系數得到,而這個展開式公式裡面的數字都是以十進制表示的。我們隻要取到這些系數就可以得到二進制數的表示,那麼我們如何取到這些系數呢?
為了簡便和易于理解,我們以十進制來分析,可以發現,最後一項值是4,10的指數是0,即最後一項值本身就是系數本身,而展開式的其他項的指數都大于等于1,即意味着它們都可以被10整除,那麼最後一項就是整體值除以10後留下的餘數,即系數。通過除10取餘的方法,我們可以得到最後一項的系數4,那麼如何取到倒數第二項的系數呢?很簡單,除以兩次10就得到了倒數第二項的系數。其他項系數可以通過同樣的方法取到。那麼什麼時候結束呢?就是我們取不到任何系數的時候,就是我們上一次除完10得到的商為0,即表示最後一個系數被我們取到了,整個過程宣告終止。
整體流程如下:
①取倒數第一個系數:
②取倒數第二個系數:
③取倒數第三個系數:
④取倒數第四個系數:
這時,商變成了0,整個過程終止。
而最終得到數即是把每一步得到的數反過來排列,4201反過來即是1024。
二進制的原理同十進制,隻是把每個過程的除數換成2即可。
注意到我們将每輪求得的結果值反過來排列才是最後的結果值,這種逆序輸出的性質剛好對應了棧的後進先出的特性。索引我們可以使用棧來保存計算過程中求得的系數,所有系數求解完畢後再逆序輸出即可。
代碼實現如下:
/**
* 十進制轉為二進制
*
* @return 十進制數對應的二進制數
*/
public static String decimal2BinaryString(int decimal) {
// 如果十進制為0,則直接返回0
if (decimal == 0) {
return "0";
}
// 使用棧來保存先求出來的系數
Deque<Integer> 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
符合我們的預期。
,