VBA之进制互转

2023-08-05 21:02:20

VBA之先说说浮点运算

浮点数和定点数都是计算机中数据的存储形式。定点数可理解为纯小数或者纯整数,但是实际上在计算机中参与运算的数字并非都是定点数。

若数据过大,比如2^400这样的数据,如果写成二进制的形式,寄存器肯定是无法放下的。于是就有了浮点数这种数据。 
浮点运算就是实数运算,因为计算机只能存储整数,所以实数都是约数,通过计算得到我们想要的数,这样浮点运算是很慢的(与定点比)而且会有误差。如果用32位来表示整数的话,那么对于无符号整数就是0 到 2^32-1,对于有符号的话就是-2^31 到 2^31-1。
众所周知计算机的底层是用二进制实现的,这就导致在计算机的计算中不可避免涉及到进制转换,我们很可能遇到需要处理进制转换的时候。
进制的转换分为整数部分和小数部分,而且因为进制之间的区别,高进制转低进制时,需要更多的位数去存储,也就是说对于同一个数,进制越低显示的数字长度越长。从低转高则相反。
比如:
4(十进制)
100(二进制)

注意:本文只有整数部分的进制转换,小数部分的没去研究,整数与小数的转换是不同的。

十进制转其它进制进制互转
Function DecToBin$(ByVal n&) '十进制数转为二进制
    Do
        DecToBin = n Mod 2 & DecToBin
        n = n \ 2
    Loop While n
End Function


 Public Function DEC_to_HEX(ByVal Dec As Long) As String '十进制转十六进制
        Dim a As String
        DEC_to_HEX = ""
        Do While Dec > 0
            a = CStr(Dec Mod 16)
            Select Case a
                Case "10": a = "A"
                Case "11": a = "B"
                Case "12": a = "C"
                Case "13": a = "D"
                Case "14": a = "E"
                Case "15": a = "F"
            End Select
            DEC_to_HEX = a & DEC_to_HEX
            Dec = Dec \ 16
        Loop
    End Function

十六进制转十进制
 Function HEX_to_DEC(ByVal Hex As String) As Long
     Dim i As Long
     Dim b As Long
     Hex = Replace(Hex, " ", "")
     Hex = UCase(Hex)
     For i = 1 To Len(Hex)
         Select Case Mid(Hex, Len(Hex) - i + 1, 1)
             Case "0": b = b + 16 ^ (i - 1) * 0
             Case "1": b = b + 16 ^ (i - 1) * 1
             Case "2": b = b + 16 ^ (i - 1) * 2
             Case "3": b = b + 16 ^ (i - 1) * 3
             Case "4": b = b + 16 ^ (i - 1) * 4
             Case "5": b = b + 16 ^ (i - 1) * 5
             Case "6": b = b + 16 ^ (i - 1) * 6
             Case "7": b = b + 16 ^ (i - 1) * 7
             Case "8": b = b + 16 ^ (i - 1) * 8
             Case "9": b = b + 16 ^ (i - 1) * 9
             Case "A": b = b + 16 ^ (i - 1) * 10
             Case "B": b = b + 16 ^ (i - 1) * 11
             Case "C": b = b + 16 ^ (i - 1) * 12
             Case "D": b = b + 16 ^ (i - 1) * 13
             Case "E": b = b + 16 ^ (i - 1) * 14
             Case "F": b = b + 16 ^ (i - 1) * 15
         End Select
     Next i
     HEX_to_DEC = b
End Function

二进制转十六进制

Function BinToHex$(bin$, Optional groupBy& = 1)
    Dim c&, i&, j&, hNdx&, nibble&, bits$, s$
    Dim b() As Byte, h() As Byte
    Static bHexChars() As Byte, pow2() As Byte
    
    Const HEX_CHARS$ = "0123456789ABCDEF"
    If (Not Not bHexChars) = 0 Then bHexChars = StrConv(HEX_CHARS, vbFromUnicode)
    If (Not Not pow2) = 0 Then pow2 = ChrW$(&H201) & ChrW$(&H804)

    b = StrConv(bin, vbFromUnicode)
    ReDim h(0 To -Int(-Len(bin) / 4) - 1)
    hNdx = UBound(h)
    
    For i = UBound(b) To 0 Step -1
        If b(i) = 49& Then nibble = nibble + pow2(c)
        c = c + 1
        If c = 4 Then
            h(hNdx) = bHexChars(nibble)
            hNdx = hNdx - 1
            nibble = 0
            c = 0
        End If
    Next
    If c Then h(hNdx) = bHexChars(nibble)
    BinToHex = StrConv(h, vbUnicode)
    
    If groupBy > 1 Then
        i = Len(BinToHex) + 1
        Do
            i = i - groupBy
            If i < 1 Then
                s = " " & Mid$(BinToHex, 1, i + groupBy - 1) & s
                Exit Do
            End If
            s = " " & Mid$(BinToHex, i, groupBy) & s
        Loop While i
        BinToHex = Trim$(s)
    End If
End Function

工作表函数实现进制转换

Sub 利用工作表函数实现进制转换()
        Dim targetNum
        '十进制的15
    targetNum = 15
   
    '八进制
    Debug.Print _
    WorksheetFunction.Dec2Oct(targetNum)
    
    '二进制
    Debug.Print _
    WorksheetFunction.Dec2Bin(targetNum)
    
    '十六进制
    Debug.Print _
    WorksheetFunction.Dec2Hex(targetNum)
    
End Sub