如何计算两个短整数的汉明距离?

时间:2014-03-18 12:34:42

标签: c++ short hamming-distance census

汉明距离:

例如,两个二进制数: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;
}

2 个答案:

答案 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;
}
相关问题