汉明距离:
例如,两个二进制数:1011和1000的HD(汉明距离)是2。
10000和01111的HD是5。
以下是代码:
有人可以向我解释一下吗?
谢谢!
short HammingDist(short x, short y)
{
short dist = 0;
char val = x^y;// what's the meaning?
while(val)
{
++dist;
val &= val - 1; // why?
}
return dist;
}
答案 0 :(得分:19)
该指令将为您提供一个数字,其中设置了不同于x到y的所有位:
char val = x^y;
示例:0b101 ^ 0b011 = 0b110
请注意val
应该具有相同类型的操作数(也称为short
)。在这里,您正在向short
转发char
,丢失信息。
以下是用于计算数字中设置的位数的算法:
short dist = 0;
while(val)
{
++dist;
val &= val - 1; // why?
}
它被称为Brian Kernighan algorithm。
所以最后,整个代码计算不同的位,即汉明距离。
答案 1 :(得分:0)
汉明距离是两个数字之间的距离,但计算如下:
例如2(010)和4(100)之间的距离。现在我们想要计算相互不同的位,因为它取xor(xor计算不同的位)。
取2和4的XOR等于6(110)并计算6中的设置位等于2,因此2和4之间的汉明距离为2.
在您的代码中:
short HammingDist(short x, short y)
{
short dist = 0;
char val = x^y;// calculate differ bit
while(val) //this dist veriable calculate set bit in loop
{
++dist;
val &= val - 1;
}
return dist;
}