我阅读了维基百科关于Hamming Weight的文章并注意到了一些有趣的东西:
因此,它等价于与长度相同的全零字符串的
汉明距离
。对于最典型的情况,即一串位,这是该串中1的数量。在这个 二进制情况下,它也被称为种群计数,popcount
或横向求和。[强调是我的]
所以我想到了一个问题。 我能不能通过对两个字符串进行XOR
操作,然后获取结果字符串的汉明重量(POPCOUNT)来计算它们之间的汉明距离?
类似于以下代码(使用gcc
内置函数):
#include <stdint.h>
int hammingDistance (uint64_t x, uint64_t y) {
uint64_t res = x ^ y;
return __builtin_popcountll (res);
}
至于为什么我想要这样做,嗯,在某些平台上,是的,这只会转化为gcc
调用一个计算popcount
的函数。例如,在没有popcnt
的x64上,gcc
输出结果为(Godbolt's GCC Online):
hammingDistance:
sub rsp, 8
xor rdi, rsi
call __popcountdi2
add rsp, 8
ret
另一方面,如果您有一个支持POPCOUNT的平台,例如包括nehalem
及其后续型号(具有POPCNT
)的x64型号,则可以获得如下的结果(Godbolt的GCC在线版):
hammingDistance:
xor rdi, rsi
popcnt rax, rdi
ret
应该会快很多,特别是一旦内联。
但回到最初的问题。你能通过计算两个字符串的异或值的汉明重量来找到它们的汉明距离吗?也就是:
HD = HW (x xor y)