当它应该是假的时,PHP Bitmask会说真的

我正在使用按位AND比较两个变量,并且它不应该返回true,但确实如此.这是我的代码,

if($d & $w){
    return true;
} else {
    return false;
}

其中$d为15,$w为31.

当位掩码不同时,为什么它会返回true?

最佳答案 你不是要比较这两个变量,而是将它们与它们进行比较.一点点而且你无法比较任何东西.

($d& $w)表示$d AND $w,其中AND是布尔AND运算符.你在这里输入两个整数变量,它们也会给出一个整数.如果整数不为空,则在比较中将整数解释为TRUE.

$d是二进制01111
$w是二进制11111
($d& $w)显然是二进制01111.如果你执行var_dump($d& $w),你会看到结果是整数,而不是布尔值;

所以,如果你想比较ANDed值,你应该选择一个比较结构,如下所示:

if ( ($d & $w) == $d ) ...

这意味着:如果$d和$w的ANDed值等于$d.

代码示例

<?php

$d = 15;
$w = 31;
$res = ($d & $w);
echo '$d=' . decbin($d) . '<br />';
echo '$w=' . decbin($w) . '<br />';
echo '($d & $w)=' . decbin($res) . '<br />';

// Boolean AND only
if($d & $w){
    echo '($d & $w) is true' . '<br />';
} else {
    echo '($d & $w) is false' . '<br />';
}

// Comparison with boolean AND
if ( ($d & $w) == $d ) {
    echo '(($d & $w) == $d) is true' . '<br />';
} else {
    echo '(($d & $w) == $d) is false' . '<br />';
}

// Simple comparison
if ($d == $w) {
    echo '($d == $w) is true' . '<br />';
} else {
    echo '($d == $w) is false' . '<br />';
}

结果

$d=1111
$w=11111
($d & $w)=1111
($d & $w) is true
(($d & $w) == $d) is true
($d == $w) is false
点赞