2
hamming('10101010','01010101')

上記の結果は8.

それを実装する方法は?

4

7 に答える 7

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
于 2012-10-09T17:14:09.323 に答える
2

既に存在するため、実装する必要はありません: http://php.net/manual/en/function.gmp-hamdist.php

(GMP サポートがある場合)

于 2010-04-19T12:04:50.363 に答える
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
于 2010-04-19T14:48:20.627 に答える
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;
}
于 2010-04-19T12:16:47.907 に答える
0

PHP マニュアルのこのコメントで提供されているコードsubstr_count()を使用して、ハミング関数を簡単にコーディングできます。

/* hamdist is equivilent to: */
echo gmp_popcount(gmp_xor($ham1, $ham2)) . "\n";
于 2010-04-19T12:53:21.687 に答える
0

試す:

echo gmp_hamdist('10101010','01010101')
于 2010-04-19T12:12:29.463 に答える