如何將二進制轉化爲十進制

三年前寫過一篇博文,https://my.oschina.net/qidis/blog/3098902, 裏面介紹瞭如何表示大數的方法。 即如何將一個很長的十進制整數字符串轉化成二進制字符串,最終使用int[]來表達BigInteger。文章中提到了需要將二進制還原成十進制的問題,最近這個問題我似乎想明白了,遂記錄之。

 

進制轉化可以轉化爲如上的數學模型, p進制和q進制的轉化。

p取2,取值於集合{0,1},  即爲整數的二進制表示。

q取10,取值於集合{0,1,2,3,4,5,6,7,8,9},即爲整數的十進制表示。

問題:已知 , 求

 

解題:   先求m,然後依次求解

 

如何求解m。 

設需要表示的整數爲n, 那麼n的範圍爲   

 使用夾逼法則即可確定m。

 

令  

運用對數法則:

挺神奇的,這樣能得到,  並且 和m相當接近。     向下取整

依次嘗試 

即可確定m的值,  確定m的值之後再來確定的值。

其實這裏有一種更簡單直觀的做法:

逐個區間進行嘗試,n一定會落在某個區間。

簡單的做法往往是低效率的,但也並非無意義。

再次使用夾逼原則:

這個過程應該可以使用二分法,先取a=5,  然後取a=3或者a=7.

 

確定了再確定的值。

 

重複上述過程即可求出集合 

不難發現,整個過程其實是在不停的進行乘法和加減法的運算,以及比較運算。

比如一直在比較二進制整數和十進制整數的大小。  其比較法則是將十進制轉化爲二進制,然後比較兩個二進制數的大小。

二進制1100 和十進制10大小的比較:

將10轉化爲1010 ,

1100

1010

顯然1100更大。

大數BigInteger可以說是整個安全領域最基礎的零件。

其實本文也是在模擬大數除法的過程,只不過除以的是10。

以下的屬於意外之喜,本來是沒有想過這個問題的。

大數做除法的過程:

1:先確定商的長度

2:  然後依次從高往低確定商每個位置的數值。

3:剩餘的即爲餘數

:  

需要的數學知識其實也都十分基礎,數列,集合,夾逼,對數函數,級數。

然後利用的級數展開進行計算

簡易的實現,勿噴。https://gitee.com/tuerqidi/my-biginteger

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章