?? 超長的進制轉換 .txt
字號:
超長的進制轉換
作者:Jean 于2008-6-16上傳
--------------------------------------------------------------------------------
當十六進制看著不方便的時候,就需要將其轉換成十進制。基本算法就是把這個十六進
制數除以10(十進制10,十六進制A),余數占十進制整數的最低位,這樣繼續下去,可以算出十進制數的次低位等等,
直到被除數小于10為止。
比如,把十六進制數 1234H 轉換成十進制數過程如下:
被除數 商 余數
1234 1D2 0
1D2 2E 6
2E 4 6
4
總共進行了3次除法,余數按先后順序排列為0 6 6 4,由于余數在0-9范圍之內,合并余數組成十進制數4660。所以,
1234H的十進制表示就是4660。
利用FPU的指令FBLD FBSTP可以簡化運算。FBLD指令可以加載內存中的一個10字節長度(最高字節是符號字節)的壓縮BCD碼
(也就是十進制數),FBSTP可以將ST0寄存器中的數轉保存成一個長10字節的壓縮BCD碼。
例如,將11111111轉換成一個DWORD型的16進制數:
BCD DB 11 11 11 11 00 00 00 00 00 00
MOV ESI,OFFSET BCD
FBLD [ESI]
FISTP DWORD PTR [EDI]
現在考慮將一個長度任意的16進制數轉換成10進制數。首先,它轉換成10進制后長度是多少?
這里我只給出算法,設Lh,Ld分別是16,10進制數的長度:
16^Lh~=10^Ld =>
Ld/Lh~=log(16)/log(10)~=1.205
Lh/Ld~=log(10)/log(16)~=0.835
30K的16進制數轉換成10進制數長度估計為30000*LOG(16)~=36124字節.
算算誤差,兩種極端情況,當16進制數最大(ffff...),10進制數最小(1000...)時,有下面的式子
16^(Lh+1)-1=10^Ld 記這里的Ld為Ldmax
相反地,當16進制數(1000...)最小,10進制數(9999...)最大時,有:
16^Lh=10^(Ld+1)-1 記這里的Ld為Ldmin
當數的長度增加時,LH/LD會趨于1/LOG(16),當數很小時,LH/LD會偏離1/LOG(16)。
現在看看轉換成10進制數后長度變化范圍最大最小有多大:
delta=Ldmax-Ldmin=log(16-17/(16^Lh+1))+1,Lh>=1.
=> 2.176 < delta < 2.205
因此,在給結果分配內存空間時,多分配2個字節,保證給足。30K就分配30K*LOG(16)+2=36126個字節。
同樣地,當是10進制數時候,將其轉成16進制數,數長約為N/LOG(16)+2個字節。
用先前介紹的方法,做將一個任意長度的數在16 10進制之間互相轉換,見例子程序,僅做參考。
[Z.t注]:附件conversion.txt是一個十六進制數,運行sample后,即轉化這個數為十進制,結果是
很大的一個數,88888....88。
--------------------------------------------------------------------------------
歡迎訪問AoGo匯編小站:http://www.aogosoft.com 下一篇>>>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -