【问题标题】:How to count the hamming distance of two short int?如何计算两个短整数的汉明距离?
【发布时间】:2014-04-24 03:31:26
【问题描述】:

汉明距离:

例如两个二进制数:1011和1000的HD(Hamming distance)是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;
}

【问题讨论】:

  • ^ 是按位异或 en.wikipedia.org/wiki/Exclusive_or & 是按位与
  • 在 wikipedia en.wikipedia.org/wiki/Hamming_distance 你可能得到这个代码的地方有一个解释
  • 我想知道的是,在面试时问这个问题如何告诉你候选人的技能,除了他们之前是否在面试中被问过这个问题,谷歌搜索它,并记住了答案?!您需要多久在生产代码中查找一次汉明距离?甚至为此使用 XOR?

标签: c++ short hamming-distance census


【解决方案1】:

此指令将为您提供一个数字,其中设置了从 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

所以最后,整个代码计算不同的位,即汉明距离。

【讨论】:

  • 感谢您的回答!
【解决方案2】:

汉明距离是两个数之间的距离,但计算如下:

例如 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;
}

【讨论】:

    猜你喜欢
    • 2017-05-09
    • 2020-12-18
    • 2019-04-23
    • 1970-01-01
    • 2016-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多