📜  长整数中的 excel vba 高字 - VBA (1)

📅  最后修改于: 2023-12-03 15:12:34.905000             🧑  作者: Mango

长整数中的 Excel VBA 高字

在 Excel VBA 中,长整数是指超出整型(Integer)取值范围(-32,768 到 32,767)的整数类型。通常,长整数使用 Long 数据类型来存储,取值范围为 -2,147,483,648 到 2,147,483,647。然而,在处理大数字时,可能需要处理更高位的数字,这时候就需要使用长整数中的高字(High-order Word)。

什么是高字

那么,“高字”到底是什么呢?我们知道,每个字节(byte)可以存储 8 位二进制数,而一个长整数(Long)需要 4 个字节来存储。因此,一个长整数可以分为两个 2 个字节的部分,即 “高字” 和 “低字”(Low-order Word)。

long-int

对于一个 32 位的长整数,它的高字是最高的 16 位,可以使用位运算来获取。

Dim myLong As Long
Dim highWord As Integer

myLong = 10000000000
highWord = myLong \ 65536

上面的代码将 myLong 中的高字取到 highWord 中。\ 是 VBA 中的整除符号,结果是向下取整到最接近的整数,即去掉小数点后面的数字。

实际应用

现在,我们已经知道了如何获取一个长整数的高字,接下来看一下它的实际应用。在 Excel VBA 中,有时候需要处理超大数字(比如在密码学中),此时就需要用到长整数的高字。

举个例子,我们要计算一个 128 位的奇数 n 的平方。由于 n 很大,所以我们无法用常规的整数类型来存储它,因此需要将它分为两个 64 位的部分 a 和 b(a 为高字,b 为低字)。那么,n 的平方可以表示为:

n^2 = (a * 2^64 + b)^2
    = a^2 * 2^128 + 2 * a * b * 2^64 + b^2

其中,a^2 和 b^2 可以用基本数据类型计算。而 2 * a * b * 2^64 这个部分,也就是 a 与 b 的乘积的二倍需要用到长整数的高字。

Function Square(n As String) As String
    ' 将 128 位的奇数 n 分成两个 64 位的部分 a 和 b
    Dim a As String
    Dim b As String

    a = Left(n, 16)
    b = Right(n, 16)

    ' 计算 a^2 和 b^2
    Dim a2 As String
    Dim b2 As String

    a2 = CStr(CLng(a) * CLng(a))
    b2 = CStr(CLng(b) * CLng(b))

    ' 计算 2 * a * b * 2^64 的值
    Dim c As Long
    Dim d As Long

    c = CLng(a) * CLng(b)
    d = CLng(highWord(CLng(c * 2)))

    ' 计算 n 的平方
    Square = a2 & String$(32, "0") & _
             CStr(CLng(c + d) Mod 65536 ^ 2) & _
             String$(32, "0") & _
             b2
End Function

上面的函数 Square 即能够计算 128 位的奇数 n 的平方。我们先将 n 按照 16 个字符为一组分为两个部分 a 和 b,然后计算 a^2 和 b^2。最后,我们需要计算 2 * a * b * 2^64 的值,这里用到了 highWord 函数来获取长整数中的高字。最后,将 a^2、2 * a * b * 2^64 和 b^2 拼接起来即得到 n 的平方。

这只是处理超大数字的其中一个例子,在实际应用中,可能还涉及到更复杂的计算。不过,对于 Excel VBA 程序员来说,掌握长整数中的高字是非常重要的一步。