ハミングウェイトに関するウィキペディアの記事を読んで、興味深いことに気づきました。
したがって、同じ長さのすべてゼロの文字列の from と同等
Hamming distance
です。最も典型的なケースであるビットのストリングの場合、これはストリング内の 1 の数です。この2 進数の場合は、人口数、popcount
または横方向の合計とも呼ばれます。[鉱山を強調]
それで、何かが私に起こりました。XOR
2 つの文字列をingし、結果の文字列のハミング ウェイト (POPCOUNT) を取得して、2 つの文字列間のハミング距離を計算できますか?
これに沿ったもの(gcc
組み込み関数を使用):
#include <stdint.h>
int hammingDistance (uint64_t x, uint64_t y) {
uint64_t res = x ^ y;
return __builtin_popcountll (res);
}
さて、なぜこれをしたいのかというと、一部のプラットフォームでは、そうです、これは単にgcc
を計算する関数への呼び出しを発行することに変換されますpopcount
。たとえば、なしの x64popcnt
では、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
特にインライン化すると、これは非常に高速になるはずです。
しかし、元の質問に戻ります。2 つの文字列の XOR のハミング重みをとって、それらのハミング距離を見つけることができますか? すなわち:
HD = HW (x xor y)