1

一部のPHPでは、2つの文字列を比較する必要がありますが、ビットマスクで1つとして設定されているビットのみを比較します。このような動作をどのように実装しますか?

私はもう試した:

$string1='aaabbb';
$string2='ababbb';
$bitmask='101101';
function compare($string1, $string2, $bitmask){
    $resultBitmask=(~($string1 ^ $string2)|~$bitmask);
} 

わかりやすくするために、説明のためにビットマスクのようにffバイトを記述しました。ビットマスクが生成されるとき、1それらは実際には16進数になります。nullバイトffの場合も同様です。0

文字列とビットマスクは、関数が呼び出されるたびに常に異なる長さになります。比較のためにビットのセットを取得できましたが、長さが異なるため、すべてが設定されているかどうかを確認できません。現時点ではpreg_match、任意のバイト数に一致する正規表現を使用していffますが、より洗練されたソリューションはありますか?

編集:文字列は最大4096ビット長であるため、数値に変換することはできません。

4

2 に答える 2

0

自己解決:

これは、実行中に同じ長さの多くの文字列で繰り返されますが、実行間で長さが異なるため、ビット演算後に結果の文字列がすべて1であり、正しい長さであることを確認する必要があります。この文字列でいっぱいの文字列は、必要なときに生成できることに気付きました。これは、文字列の比較が1000回程度に1回程度ということはめったにありません。次のように実行する前に文字列を生成できます。

$ones=str_repeat(chr(255), $byte_length);

compare(次に、関数を少し異なる方法で定義します。

function compare($string1, $string2, $bitmask){
    global $ones;
    $resultBitmask=(~($string1 ^ $string2)|~$bitmask);
    if ($resultBitmask=$ones){
         return 1;
    } else {return 0};
} 

その秘訣は、str_repeat私が以前は気づかなかったものでした。

于 2012-10-28T20:32:37.490 に答える
0

それはそれを行う最も派手な方法ではありませんが:

$stillTheSame = true;
for($i=0;$i<=strlen($bitmask); $i++)
{
  if($bitmask[$i] == 1)
  {
    if($string1[$i] != $string2[$i]) 
    {
      $stillTheSame = false;
      break;
    }  
  }
}

実際のチェックロジックについてはよくわかりませんが、これが役立つことを願っています。

于 2012-10-24T23:52:20.303 に答える