如何计算PHP中两个二进制序列的汉明距离?

时间:2010-04-19 12:00:19

标签: php hamming-distance

hamming('10101010','01010101')

上述结果应为8

如何实施?

7 个答案:

答案 0 :(得分:5)

这里没有安装GMP是任何相同长度二进制字符串的简单解决方案

function HammingDistance($bin1, $bin2) {
    $a1 = str_split($bin1);
    $a2 = str_split($bin2);
    $dh = 0;
    for ($i = 0; $i < count($a1); $i++) 
        if($a1[$i] != $a2[$i]) $dh++;
    return $dh;
}

echo HammingDistance('10101010','01010101'); //returns 8

答案 1 :(得分:2)

您不需要实现它,因为它已经存在: http://php.net/manual/en/function.gmp-hamdist.php

(如果您有GMP支持)

答案 2 :(得分:1)

如果您没有GMP支持,总会有这样的事情。缺点是它只适用于最长32位的二进制字符串。

function hamdist($x, $y){
  for($dist = 0, $val = $x ^ $y; $val; ++$dist){ 
      $val &= $val - 1;
  }
  return $dist;
}

function hamdist_str($x, $y){
    return hamdist(bindec($x), bindec($y));
}


echo hamdist_str('10101010','01010101'); //8

答案 3 :(得分:1)

以下函数适用于十六进制字符串(等长),长度超过32位。

function make_color($value)
{
    $red = $value > 0.5
       ? (1 - 2 * ($value - 0.5) / 1)
       : 1;
    $green = $value > 0.5
        ? 1
        : 2 * ($value / 1);
    $blue = 0;
    return "rgb($red,$green,$blue)";
}

答案 4 :(得分:0)

尝试:

echo gmp_hamdist('10101010','01010101')

答案 5 :(得分:0)

尝试此功能:

function hamming($b1, $b2) {
    $b1 = ltrim($b1, '0');
    $b2 = ltrim($b2, '0');
    $l1 = strlen($b1);
    $l2 = strlen($b2);
    $n = min($l1, $l2);
    $d = max($l1, $l2) - $n;
    for ($i=0; $i<$n; ++$i) {
        if ($b1[$l1-$i] != $b2[$l2-$i]) {
            ++$d;
        }
    }
    return $d;
}

答案 6 :(得分:0)

您可以在substr_count()the code provided in this comment on the PHP manual的帮助下轻松编码汉明功能。

/* hamdist is equivilent to: */
echo gmp_popcount(gmp_xor($ham1, $ham2)) . "\n";