我阅读了有关Hamming Weight的 Wikipedia 文章并注意到一些有趣的事情:
因此它等价于
Hamming distance
相同长度的全零字符串。对于最典型的情况,一串位,这是字符串中 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
. 例如,在没有 的 x64 上popcnt
,gcc
吐出(Godbolt 的 GCC Online):
hammingDistance:
sub rsp, 8
xor rdi, rsi
call __popcountdi2
add rsp, 8
ret
OTOH,如果你有一个支持 POPCOUNT 的平台,比如 x64 模型,包括nehalem
和之后(有POPCNT
),你会得到(Godbolt 的 GCC Online):
hammingDistance:
xor rdi, rsi
popcnt rax, rdi
ret
这应该更快,尤其是内联后。
但回到最初的问题。你能用两个字符串的异或的汉明权重来找到它们的汉明距离吗?IE:
HD = HW (x xor y)