本算法可以应用于所有进制之间的转换方式,你可以应用于二进制、八进制、十进制、十六进制、六十四进制、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