бит — PHP Bitmask говорит, что истина, когда она должна быть ложной

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

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

где $d 15 и $w 31

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

4

Решение

Ты не Сравнение две переменные, вы а такжевместо этого. С побитовым И вы не можете ничего сравнить.

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

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

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

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

что означает: если значение ANDed $ 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

Другие решения

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

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

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

0