Битовая маска PHP говорит истину, когда она должна быть ложной


Я сравниваю две переменные с побитовым И, и это не должно возвращать значение true, но оно возвращает. Вот мой код,

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

Где $d равно 15, а $w равно 31.

Почему он возвращает значение true, когда битовые маски разные?

 4
Author: Artemis, 2016-02-28

2 answers

Вы не сравниваете две переменные, вместо этого вы и вводите их. С помощью побитового, И вы ничего не можете сравнить.

($ d & $w) означает $d И $w, где И является логическим оператором И. Здесь вы вводите две целочисленные переменные, которые тоже дадут целое число. И целое число интерпретируется как ИСТИННОЕ при сравнении, если оно не равно нулю.

$d является двоичным 01111
$w является двоичным 11111
($d & $w), очевидно, является двоичным 01111. Если вы сделаете var_dump($d & $w) вы видите, что результат является целым числом, а не логическим;

Итак, если вы хотите сравнить значение ANDed, вам следует выбрать конструкцию сравнения, например:

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

Что означает: если заданное значение $d и $w равно $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
 2
Author: hherger, 2016-02-28 07:26:29

Поскольку 15 и 31 больше 0, что является ложным, поэтому биты в заданной скорости равны истине. Я думаю, что вы хотите:

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

Вам необходимо использовать круглые скобки, чтобы обеспечить желаемый приоритет.

 0
Author: Munsterlander, 2016-02-28 06:55:21