1. 程式人生 > >任意長度的十進位制數轉為二進位制、十六進位制,和大數除法演算法(只有小半份)

任意長度的十進位制數轉為二進位制、十六進位制,和大數除法演算法(只有小半份)

輾轉求餘法實現的任意長度十進位制數到2進位制和16進位制轉換方法

Sub asdf()
Debug.Print Dec2Bin("3214123412351234123415123412351234123451235123412341234")
Debug.Print Dec2Hex("3214123412351234123415123412351234123451235123412341234")
End Sub


'任意長度的10進位制數的整除運算,除數為2
Function Div2(devidend As String) As String
    Dim Remain As Boolean   '當前數位是否有餘數
    For i = 1 To Len(devidend)
        Dim CuInt As Integer
        CuInt = IIf(Remain, 10, 0) + Mid(devidend, i, 1) '上一位有餘數時,加到當前數位上再做除法
        Remain = Not (CuInt Mod 2 = 0)
        Div2 = Div2 & CuInt \ 2
    Next i
End Function


'任意長度的10進位制數對2求餘(判斷最後一位數字是奇數還是偶數)
Function Mod2(devidend As String) As Integer
    Mod2 = IIf(Right(devidend, 1) Mod 2 = 1, 1, 0)
End Function


'任意長度的10進位制數轉為2進位制,輾轉求餘
Function Dec2Bin(devidend As String) As String
    Dim res As String
    res = devidend
    Do
        Dec2Bin = Mod2(res) & Dec2Bin
        res = Div2(res)
    Loop Until (res = 0)
End Function


'任意長度的10進位制數轉為16進位制(先轉成2進位制,再轉成16進位制)
Function Dec2Hex(devidend As String) As String
    Dim res As String
    res = Dec2Bin(devidend)
    If Len(res) Mod 4 > 0 Then res = String(4 - (Len(res) Mod 4), "0") & res '補齊起始4位
    For i = 1 To Len(res) - 3 Step 4
        Dec2Hex = Dec2Hex & Hex(Mid(res, i, 1) * 8 + Mid(res, i + 1, 1) * 4 + Mid(res, i + 2, 1) * 2 + Mid(res, i + 3, 1))
    Next i
End Function