【问题标题】:Comparing two strings, limited via bitmask in PHP比较两个字符串,通过 PHP 中的位掩码进行限制
【发布时间】:2012-10-29 04:32:37
【问题描述】:

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

我试过了:

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

为了清楚起见,我在位掩码中将ff 字节写为1 以进行说明。当生成位掩码时,它们实际上是十六进制的ff0 也是空字节。

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

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

【问题讨论】:

  • 我认为您必须将它们转换为数字。
  • @jarchuleta 我愿意,但它们最多可达 4 KB。
  • 你可能会找到大量的图书馆。或者一次将它们转换一个字节然后比较。
  • @jarchuleta 该代码完全可移植到可能没有庞大数字库的 Web 主机。至于第二个想法,你能补充一个完整的答案吗?

标签: php string bitmask


【解决方案1】:

这不是最快速的方式,但是:

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

不确定您的实际检查逻辑,但这应该会有所帮助。

【讨论】:

  • 这不是比递归更遍历吗?但是,我仍然必须与其他开发人员一起工作,而且我通常更愿意写一些易于阅读的东西,而不是每次他们看到它时都必须向每个人解释它。一切为了轻松的生活..
  • 对不起,我的术语不好。确实是遍历。
  • 这是一个很好的答案,但不幸的是,对于 160 字节字符串的 1000 次迭代,它似乎需要一秒钟的时间。对不起。
  • 不是为速度而生的,真的。 2个字符串总是1个位掩码,还是比较很多字符串1个bitcode?​​span>
  • 回复:您的最后一条评论。我重写了一些周围的代码,因此相同的位掩码适用于很多字符串,但是在每次运行数千个字符串之间,它需要一个新的位掩码和长度。
【解决方案2】:

自行解决:

由于这将在运行期间重复许多相同长度的字符串,但在运行之间具有不同的长度,因此我需要检查按位运算后的结果字符串是否全为 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-24
    • 2017-05-18
    • 1970-01-01
    • 2011-10-14
    • 1970-01-01
    • 2016-01-10
    • 2016-07-03
    相关资源
    最近更新 更多