1

在某些 PHP 中,我需要比较两个字符串,但仅限于在位掩码中设置为 1 的位。我将如何实现这种行为?

我试过了:

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

为了清楚起见,出于说明目的,我将ff字节写入1位掩码中。ff当生成位掩码时,它们实际上是十六进制的。0空字节也是如此。

每次调用函数时,字符串和位掩码的长度总是不同的。我设法获得了一组位进行比较,但由于长度不同,我无法检查它们是否都已设置。目前,我一直在使用preg_match匹配任意ff字节数的正则表达式,但有更优雅的解决方案吗?

编辑:由于字符串的长度不超过 4096 位,因此它们不能转换为数字。

4

2 回答 2

0

自行解决:

由于这将在运行期间重复许多相同长度的字符串,但运行之间的长度不同,因此我需要检查按位运算后的结果字符串是否全为 1 且长度正确。我意识到可以在需要时生成这个充满 1 的字符串,这种情况很少见,每 1000 次左右的字符串比较一次。我可以在运行之前生成字符串,如下所示:

$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 回答