进制之间的转换

        本算法可以应用于所有进制之间的转换方式,你可以应用于二进制、八进制、十进制、十六进制、六十四进制、100进制、三百进制等.......前提是必须提供不能重复的进制表示字符,你可以用任何的字符表示,包括各种英文的、中文的、拉丁文的、日文假名的等,总之只要不重复就行。

       以下用16进制做说明(用0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F这16个字符表示):

       从10进制转换为特殊进制的算法是:

       用预转换的10进制数整除进制的位数,结果=沉余整数部分+余数用进制字符表示。eg:10进制1000转换为16进制为1000/16得到整数部分为:62,余数为8,再让62作为被除数再进行整除,整数部分为3,余数为14(用E表示),直到整数部分小于进制字符能表示的最大数值为止,然后倒序列出来:那么转为为16进制的结果为3E8。

        从特殊进制转换10进制的算法是:

        分别取出每一个字符对应的值×特殊进制所表示的最大值的位数-1的次幂就是要转换的10进制的值了。

       16进制3E8转换为10进制的表达式为:3×163-1+14×162-1+8×161-1=3×256+14×16+8=1000

     

       以下是一个完整的特殊进制与10进制之间转换的类,在vb2003下调试通过:

'进制转换对象
'本对象专门对于特殊的进制转换,比如:20进制、100进制.....
'使用时首先设置进制的表示字符

Public Class JinZhiConversion
    Private mExpressChar As String

    Public Property ExpressChar() As String
        Get
            Return mExpressChar
        End Get
        Set(ByVal Value As String)
            mExpressChar = Value
            SplitCharArray(Value)
        End Set
    End Property

    Public Sub New(Optional ByVal m_ExpressChar As String = "")
        Me.ExpressChar = m_ExpressChar
    End Sub

    '转换为十进制字符
    Public Function ToDecimalist(ByVal m_InputChars As String) As Int64
        If aryChar Is Nothing Then
            MsgBox("你的特殊进制字符串ExpressChar还没有正确设置!", MsgBoxStyle.Exclamation)
            Return ""
        End If

        Dim mm, nn As Int16
        mm = Len(m_InputChars)
        Dim res As Int64 = 0

        Dim strs As Char
        For nn = 1 To mm
            strs = Mid(m_InputChars, nn, 1)
            res += ToValue(strs) * (aryChar.Length ^ (mm - nn))
        Next

        Return res
    End Function

    '从十进制转换为特殊进制
    Public Function FromDecimalist(ByVal m_InputNums As Int64) As String
        If aryChar Is Nothing Then
            MsgBox("你的特殊进制字符串ExpressChar还没有正确设置!", MsgBoxStyle.Exclamation)
            Return ""
        End If

        Dim res As String = ""
        Dim mm As Int16

        Do
            If m_InputNums < aryChar.Length Then
                res = aryChar(m_InputNums) & res
                Return res
            Else
                mm = m_InputNums Mod aryChar.Length
                m_InputNums = m_InputNums / aryChar.Length
                res = aryChar(mm) & res
            End If
        Loop
    End Function

    Private aryChar() As Char

    '拆分为字符数组
    Private Sub SplitCharArray(ByVal m_ExpressChar As String)
        Dim mm As Int16 = Len(m_ExpressChar)
        ReDim aryChar(mm - 1)

        Dim nn As Int16
        For nn = 0 To mm - 1
            aryChar(nn) = Mid(m_ExpressChar, nn + 1, 1)
        Next

        Dim ii, jj As Int16
        '判断是否有重复的字符
        For ii = 0 To mm - 2
            For jj = ii + 1 To mm - 1
                If aryChar(ii) = aryChar(jj) Then
                    MsgBox("字符" & aryChar(ii) & "(ASCII码为:" & Asc(aryChar(ii)) & ")重复!" & vbCrLf & "位置分别是:" & ii & "和" & jj, MsgBoxStyle.Exclamation, "进制表示字符不能重复 ...")
                    aryChar = Nothing
                    Return
                End If
            Next
        Next
    End Sub

    '由特殊进制字符转换为索引数字
    Public Function ToValue(ByVal m_Char As Char) As Int16
        If aryChar Is Nothing Then
            Return -1
        End If

        Dim mm, nn As Int16
        For mm = 0 To aryChar.Length - 1
            If aryChar(mm) = m_Char Then
                Return mm
            End If
        Next

        Return -1
    End Function

    '由索引转化为字符
    Public Function ToChar(ByVal m_Index As Int16) As Char
        If aryChar Is Nothing Then
            Return ""
        End If

        Return aryChar(m_Index)
    End Function

    Protected Overrides Sub Finalize()
        MyBase.Finalize()
    End Sub
End Class

说明:在使用本转换类的时候必须首先设置特殊进制的表示字符ExpressChar,然后用ToDecimalist和FromDecimalist进行与10进制之间的转换!如果你要使用2进制转换为16进制可以采用的方式为2进制转换为10进制,再用10进制转换为16进制就可以了,当然可以扩展为16进制转换为10000进制都是没有任何问题的被类对象。

用法:

dim d as new JinZhiConversion("01234567")     '八进制

10进制52转换为八进制为:d.FromDecimalist(52)=>64

8进制100转换为10进制为:d.ToDecimalist(100)=>64

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值