Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/229.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP位掩码在应该为false时表示true_Php_Bit - Fatal编程技术网

PHP位掩码在应该为false时表示true

PHP位掩码在应该为false时表示true,php,bit,Php,Bit,我用一个按位AND比较两个变量,它不应该返回true,但它返回true。这是我的密码 if($d & $w){ return true; } else { return false; } 其中,$d为15,$w为31 当位掩码不同时,为什么返回true?因为15和31大于0,这是false,所以设置速率中的位为true。我认为你想要的是: if(($d & $w)== true){ return true; } else { return fal

我用一个按位AND比较两个变量,它不应该返回true,但它返回true。这是我的密码

if($d & $w){
    return true;
} else {
    return false;
}
其中,
$d
为15,
$w
为31


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

因为15和31大于0,这是false,所以设置速率中的位为true。我认为你想要的是:

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

您需要使用括号来确保所需的优先级。

您不是在比较这两个变量,而是在比较它们。以位为单位,不能进行任何比较

($d&$w)表示$d和$w,其中和是布尔AND运算符。这里是两个整型变量的和运算,这也会得到一个整型。如果整数不为null,则在比较中它被解释为TRUE

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

因此,如果要比较ANDed值,应选择比较结构,如下所示:

if ( ($d & $w) == $d ) ...
这意味着:如果$d和$w的ANDed值等于$d

代码示例
($d和$w)将给出二进制01111(十进制15),因为它大于零,所以被解释为TRUE。但它永远不会是布尔类型的结果。严格地说,结果永远不会是真的。如果你编码If($d&$w)===true),结果将是FALSE。我引用了它作为我的基础,我知道它会返回FALSE,但我不认为它会键入或计算为布尔值。谢谢,我不知道它是如何工作的,根据我读到的文章,它应该以第一种方式工作,不过我想那篇文章是错的。再次感谢你。
<?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