2012-11-02 72 views
1

是否可以很容易地转换成字符串按位比较

"4 | 2" 

的字符串转换成标准的按位比较,因此返回6.

,这样我可以做到这样的事情

$var1 = "4 | 2"; 
if(evalAsBitwise($var1) & 2) { 
    return true; 
} else { 
    return false; 
} 
+0

是否需要支持所有按位运算符(|&^)?如果您需要全部支持,则必须构建自己的表达式树并处理优先级等。 – Htaras

+0

截至目前情况并非如此。也许将来我可能会。你有没有想过我可以暂时使用的工作。 –

回答

1

如果用空格分隔字符串作为分隔符,则会得到三个部分:第一个数字,操作符和第二个数字。在您的功能中,您可以使用开关来确定要使用的操作员。

喜欢的东西

function evalAsBitwise($input) {  

    $parms = explode(" ", $input);  
    $next; 
    $op; 

    $total = array_shift($parms); 

    while (!empty($parms)) { 
    $next = array_shift($parms); 
    if(is_numeric($next)) { 
     switch($op) { 
      case "|": $total = $total | intval($next); break; 
      case "&": ... 
     } 
    } 
    else { 
     $op = $next; 
    } 
    }// End while 
    return $total; 
} 

您还需要测试〜。但是如果你需要它做更复杂的表达式(如a(& b ^(c^d)),它会变得更加复杂。

+0

这非常接近我所需要的,但是如果$ var =“4 | 2 | 1”会怎样。有没有另外一种方法可以写出来,以便在爆炸后使用X数量的碎片? –

+0

是否需要处理操作顺序的括号? – Nate

+0

我不相信我会的。至少还没有。目前它总是($ var1&$ var2)。 $ var2是一个int。 $ var1将是一个2-4值的OR比较。 –

0

试试这个。它仅适用于按位或。

function evalAsBitwise($var) { 
    $values = explode($var); 
    $result = 0; 
    foreach ($$values as &$value) { 
     $value = trim($value); 
     $result = intVal($value) | intVal($result); 
    } 
    return $result; 
} 

我的PHP技能有点生疏,请检查语法错误。