在VBA Excel中计算汉明重量和/或距离

时间:2016-03-16 19:59:31

标签: excel-vba hamming-distance hammingweight vba excel

我正在尝试比较两个客户端,两个客户的质量可以通过二元选择来定义(例如客户端是否使用产品)。
经过大量的在线搜索后,看起来我需要使用汉明距离或其等价物:找到汉明重量到两个单词之间的异或运算结果。

对于一个具体的例子,汉明距离在1001和100之间。 1011:

  

计算数字1001 XOR 1011 = 0010
  汉明重量为0010 = 1(位数设置为   1在0010)

对于高达96位的字,我需要这样做。

我在

上找到了一些信息

MSDN

http://people.revoledu.com/kardi/tutorial/Similarity/HammingDistance.html

和大量代码,例如

http://trustedsignal.blogspot.ca/2015/06/xord-play-normalized-hamming-distance.html

但仅限于C,Java,Perl,O,opencl ......除了Excel VBA之外的任何东西。

到目前为止,这是我设法组合起来的。

它可以工作,但遗憾的是仅适用于30位或更少的字,并使用一种粗略的方法:对两个数字X和Y进行XOR,然后转换为表示二进制数的字符串。然后在取出1后计算字符串的长度。我想这是一种更优雅,更有效的方式。

Public Function HamDist(x As Long, y As Long, NbBit As Integer)

Dim i As Long, BinStrg As String, bxor As Long 

bxor = x Xor y 

BinStrg = "" 

For i = NbBit To 0 Step -1 ‘going from left to right 
         If bxor And (2 ^ i) Then
            BinStrg = BinStrg + "1" ‘add a 1 to the string 
         Else
            BinStrg = BinStrg + "0"
         End If
      Next

 HamDist = Len(BinStrg) - Len(Replace(BinStrg, "1", "")) ' replace the 1 by nothing and count  the length of the resulting string 
End Function

通过计算汉明重量或距离,你能帮助它使用VBA for Excel 2010 及以下(udf或sub)中的96位字吗?

1 个答案:

答案 0 :(得分:1)

如果以String形式存储品质链(例如,只包含字母'T'和'F'的字符串),可以使用循环轻松完成。

Function hammingDistance(qualities1 As String, qualities2 As String) As Integer

    If Len(qualities1) <> Len(qualities2) Then
        hammingDistance = -1
        Exit Function
    End If

    Dim i, result As Integer
    result = 0

    For i = 1 To Len(qualities1)
        If Mid(qualities1, i, 1) <> Mid(qualities2, i, 1) Then result = result + 1
    Next

    hammingDistance = result

End Function