`
cjc
  • 浏览: 680488 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

关于天文数字十进制与十六进制间的转换

IE 
阅读更多

对于一般的整型数字,16进制与10进制 间的转化可以用CLNG(),HEX()函数解决,但遇上天文数字,这些函数就无能为力了。下面是笔者写的几个函数,演示了天文数字计算中的一些技巧。

Dim largehex As String, largedec As String, start As Long, Y(20) As String


'预备函数
Function sums(ByVal X As String, ByVal Y As String) As String ' sum of two hugehexnum(两个大数之和)
Dim max As Long, temp As Long, I As Long, result As Variant
max = IIf(Len(X) >= Len(Y), Len(X), Len(Y))
X = Right(String(max, "0") & X, max)
Y = Right(String(max, "0") & Y, max)
ReDim result(0 To max)
For I = max To 1 Step -1
result(I) = Val(Mid(X, I, 1)) + Val(Mid(Y, I, 1))
Next
For I = max To 1 Step -1
temp = result(I) \ 10
result(I) = result(I) Mod 10
result(I - 1) = result(I - 1) + temp
Next
If result(0) = 0 Then result(0) = ""
sums = Join(result, "")
Erase result

End Function

Function multi(ByVal X As String, ByVal Y As String) As String 'multi of two huge hexnum(两个大数之积)
Dim result As Variant
Dim xl As Long, yl As Long, temp As Long, I As Long
xl = Len(Trim(X))
yl = Len(Trim(Y))
 
ReDim result(1 To xl + yl)
For I = 1 To xl
For temp = 1 To yl
result(I + temp) = result(I + temp) + Val(Mid(X, I, 1)) * Val(Mid(Y, temp, 1))
Next
Next

For I = xl + yl To 2 Step -1
temp = result(I) \ 10
result(I) = result(I) Mod 10
result(I - 1) = result(I - 1) + temp
Next

If result(1) = "0" Then result(1) = ""
multi = Join(result, "")
Erase result

End Function
Function POWERS(ByVal X As Integer) As String ' GET 16777216^X,ie 16^(6*x)(16777216的X 次方)
POWERS = 1
Dim I As Integer
For I = 1 To X
POWERS = multi(POWERS, CLng(&H1000000))
Next
End Function
Function half(ByVal X As String) As String 'get half of x(取半)
X = 0 & X
Dim I As Long
ReDim result(2 To Len(X)) As String
For I = 2 To Len(X)
result(I) = CStr(Val(Mid(X, I, 1)) \ 2 + IIf(Val(Mid(X, I - 1, 1)) Mod 2 = 1, 5, 0))
Next
half = Join(result, "")
If Left(half, 1) = "0" Then half = Right(half, Len(half) - 1) ' no zero ahead
End Function


'另一个有用的函数:
Function POWERXY(ByVal X As Integer, ByVal Y As Integer) As String 'GET  X^Y(X 的 Y 次方)
Dim I As Integer
POWERXY = X
For I = 2 To Y
POWERXY = multi(POWERXY, X)
Next
End Function

'进制转换函数:


'16 to 10
Function HEXTODEC(ByVal X As String) As String
Dim A() As String, I As Long, UNIT As Integer
For I = 1 To Len(X)
If Not IsNumeric("&h" & Mid(X, I, 1)) Then MsgBox "NOT A HEX FORMAT!", 64, "INFO": Exit Function
Next
X = String((6 - Len(X) Mod 6) Mod 6, "0") & X

UNIT = Len(X) \ 6 - 1
ReDim A(UNIT)
For I = 0 To UNIT
A(I) = CLng("&h" & Mid(X, I * 6 + 1, 6))
Next
For I = 0 To UNIT
A(I) = multi(A(I), POWERS(UNIT - I))
HEXTODEC = sums(HEXTODEC, A(I))
Next
End Function

 

 

 

' 10 to 16
Function dectohex(ByVal hugenum As String) As String ' trans hugenum to hex
Do While Len(hugenum) > 2
dectohex = Hex(Val(Right(hugenum, 4)) Mod 16) & dectohex
For I = 1 To 4 'devide hugenum  by 16
hugenum = half(hugenum)
Next
Loop
dectohex = Hex(Val(hugenum)) & dectohex
End Function

 

Private Sub Form_Load()
For I = 0 To 20
Y(I) = "1234567890ABCDEF"
Next

largehex = Join(Y, "")
End Sub

 

'hextodec
Private Sub Command1_Click()
start = Timer
largedec = HEXTODEC(largehex)
Debug.Print largedec
MsgBox "hex(" & Len(largehex) & " 位): " & largehex & vbCrLf & vbCrLf & "dec(" & Len(largedec) & " 位): " & largedec, 64, "用时" & Format((Timer - start), "0.0000") & " 秒!"
End Sub


'dectohex
Private Sub Command2_Click()
largedec = "27305594525408320787401222904174795936368587913861811995606068514338921239280447480038845811151419865392100570221250636783105942723266982313358992551204806603060637911792055430458953651997903849585424629638958641829173494438455892966522070157613386886352421847833413821003678138295449221439062614172249927946884678471687751616589458280098503446100701588657220466765694306218356144887228155732857434394095"


start = Timer
largehex = dectohex(largedec)
MsgBox "dec(" & Len(largedec) & " 位): " & largedec & vbCrLf & vbCrLf & "hex(" & Len(largehex) & " 位): " & largehex, 64, "用时" & Format((Timer - start), "0.0000") & " 秒!"
End Sub

'get x^y
Private Sub Command3_Click()
start = Timer
MsgBox "2^3000=" & POWERXY(2, 3000), 64, "用时" & Format((Timer - start), "0.0000") & " 秒!"
End Sub

 

分享到:
评论

相关推荐

    进制数转换二进制八进制十进制十六进制之间转换方法PPT学习教案.pptx

    (3)十进制与十六进制之间的转换: * 十进制转换为十六进制:将十进制数除以16,商数作为高位,余数作为低位。 * 十六进制转换为十进制:将十六进制数按位权乘以16的N-1次方。 (4)二进制与八进制之间的转换: ...

    二进制、十进制、十六进制、C51十六进制转换器

    在程序中,可以使用内置函数或自定义函数实现不同进制间的转换。 ASCII代码表是一个编码标准,它将字符(包括字母、数字、标点符号等)与特定的数值对应起来。ASCII码是七位二进制数,但通常以十进制形式表示。例如...

    十进制转换为十六进制(模块化程序)

    在Python这样的高级编程语言中,我们可以使用内置的`hex()`函数直接进行十进制到十六进制的转换,但为了实现模块化程序,我们需要手动编写这些逻辑,这有助于理解数字系统的转换过程和编程的基本原理。 例如,转换...

    byte、十进制、十六进制间的转换

    byte数组、十进制、十六进制间的两两转换

    labview十进制到十六进制转换

    实现labview编写上位机以十进制输入数据直接以十六进制发送到下位机的转换程序

    【老生谈算法】matlab十进制转换十六进制及互转.docx

    MATLAB 十进制与十六进制之间的转换 在计算机科学和信息技术领域中,十进制和十六进制是两个常用的数字表示系统。十进制是我们日常生活中使用的数字系统,而十六进制则广泛应用于计算机编程和数据存储中。MATLAB ...

    十进制转换十六进制

    在实际应用中,我们常常使用编程语言内置的函数来完成这些转换,例如在Delphi或C++中,可以使用`IntToHex`和`HexToInt`函数进行十进制与十六进制之间的转换,`BinToDec`和`DecToBin`用于二进制与十进制的转换。...

    汇编语言进制(二进制,八进制,十进制,十六进制)转换

    2. **其他进制转二进制**:可以逐位转换,将每个数字转换成相应的二进制表示。例如,八进制的5转为二进制是0101,十六进制的C转为二进制是1100。 3. **八进制转其他进制**:类似二进制转换,但首先需要将八进制转换...

    C语言,实现进制转换,十进制转换为十六进制

    C语言,实现进制转换,十进制转换为十六进制 例如输入10,转换结果为a

    BAT批处理脚本-格式转换-十进制转十六进制.cmd.zip

    本压缩包文件"BAT批处理脚本-格式转换-十进制转十六进制.cmd.zip"提供了一个批处理脚本,用于将十进制数字转换为十六进制格式。下面我们将详细讨论这个脚本的工作原理、批处理脚本的基本概念以及如何使用和修改这种...

    十进制和十六进制转换成float、double数据

    总结来说,了解如何在MATLAB和FPGA环境中进行十进制与十六进制之间的转换以及浮点和双精度数值的处理是十分关键的。无论是进行数值计算还是硬件设计,掌握这些基本的进制转换技巧都将使你的工作更加得心应手。通过...

    十进制转十六进制包含大小端设置_大小端_matlab_十进制_十六进制_

    本文将详细讨论大小端模式,并通过MATLAB实现一个将十进制数转换为十六进制数的函数,同时允许用户选择大小端模式。 首先,我们来解释一下大小端模式。在多字节的数据类型(如32位整数)中,最高有效位(MSB)和...

    vb十进制转十六进制源码

    在VB(Visual Basic)6.0中,我们可以使用内置的函数和方法来实现十进制到十六进制的转换。本篇文章将详细探讨如何在VB中进行这种转换,并提供相关的源码示例。 首先,了解进制的概念至关重要。进制是数字符号的...

    易语言十进制与十六进制转换比较源码.rar

    在压缩包中的"易语言十进制与十六进制转换比较源码"中,我们可以预见到源码文件会包含两个主要部分:一个是将十进制数转换为十六进制的函数实现,另一个是将十六进制字符串转换回十进制数的函数实现。这些源码可能...

    java中进制转换(二进制,十进制,十六进制)及字节数组与十六进制的转换

    本篇将详细阐述如何在Java中进行二进制、十进制和十六进制之间的转换,以及字节数组与十六进制字符串的相互转换。 一、进制转换 1. **二进制转十进制**:Java中可以使用`Integer.parseInt()`或`Long.parseLong()`...

    如何实现十进制和十六进制转换Visual Basic6.0源程序,VB6.0源代码

    在编程领域,十进制与十六进制之间的转换是一项基础且重要的技能,特别是在处理二进制数据、内存地址或颜色编码时。Visual Basic 6.0(VB6.0)作为经典的编程语言,提供了丰富的内置函数和方法来实现这种转换。下面...

    十进制与十六进制的转换 数据结构c

    ### 十进制与十六进制的转换及数据结构应用 #### 一、知识点概述 在计算机科学领域,数据在存储、处理时往往需要在不同的数值系统之间进行转换,其中最为常见的就是十进制(Base-10)与十六进制(Base-16)之间的...

    十进制 八进制 二进制 十六进制转换工具

    - **二进制与八/十六进制转换**:可以通过对应位数的转换规则直接转换。例如,二进制1101转换为八进制是15,转换为十六进制是D。 - **八/十六进制转二进制**:将每个数字转换为相应的二进制表示,然后连接起来。...

    易语言源码易语言十进制与十六进制转换比较源码.rar

    - 源码“易语言十进制与十六进制转换比较源码”可能包含了示例代码,用于演示如何在易语言中实现这两种进制间的转换。通常会包括两个主要部分:一个函数或过程用于十进制转十六进制,另一个用于十六进制转十进制。 ...

Global site tag (gtag.js) - Google Analytics