2013-11-15 2 views
-3

У меня небольшая проблема с поразрядным «&» компиляторами PHP. Im пытается сравнить оба логических значения, но когда я их сравниваю, побитовый оператор дает мне целое число вместо булева.Побитовый оператор булевых вычислений

Обе переменные проверяются, если они действительны. Если они есть, то функция возвращает, конечно, истину.

$bValue1 = true; 
$bValue2 = true; 

Когда я совмещаю это в var_dump с побитовым оператором, тогда он возвращает int (0). Зачем?

var_dump($bValue1 & $bValue2); 
+5

Зачем вам использовать побитовый оператор на булевом?!? – Danny

+1

Потому что это то, что делает побитовая операция. – deceze

ответ

2

& Побитовое И. Предполагая, что вы делаете 14 & 7:

14 = 1110 
7 = 0111 
--------- 
14 & 7 = 0110 = 6 

& & логично и. Рассмотрим таблицу истинности:

$bValue1 = true; 
$bValue2 = true; 

$bValue1  $bValue2  $bValue1 && $bValue2 
false  false   false 
false  true   false 
true   false   false 
true   true   true 

& => сделать побитовой операции. он просто выполняет операцию на основе значений бит.

& & => do логический И работа. Это просто проверка значений true или false. Основываясь на логическом значении, он будет оценивать выражение

1

Это потому, что «побитовое» относится к числовому значению байтов.

Вы хотите Логический оператор:

var_dump($bValue1 && $bValue2); 
2

«&» оператор работает над битами, так это интерпретировать булевы как целые числа, а затем сравнивая биты.

Для сравнения Booleans следует использовать логический оператор '& &'.

0

Потому что вы должны использовать логические операторы на булевых (& &, ||, ==). Побитовое использование целых чисел.

+0

Не только «целые числа», но и * байты *. ''a' & 'b'' также работает. – deceze

0

использования и на месте & вы можете использовать & & также

$bValue1 = true; 
$bValue2 = true; 
var_dump($bValue1 & $bValue2); 
2

Ответ на ваш вопрос, почему выглядит следующим образом:

Ваши переменные оба истинны. По побитовому сравнению true переходит в целое число (1) (false превращается в 0) и возвращает целое число, содержащее все совпадающие/равные биты, а не boolean.

true => 1 

1 & 1 === 1 

Результат на словах: Биты с обеих сторон равны (1).

101 & 110 === 100 

В словах: Первый бит не равен (справа налево), второй - нет, позиция 3 имеет равные биты.

От PHP.net:

$a & $b  And  Bits that are set in both $a and $b are set. 

См http://php.net/manual/en/language.operators.bitwise.php

результат на сравнивающих битов равно целому числу и ни битовая маска, ни его сравнение маски являются булево. Они (без знака) целые числа переменной байтовой длины по своей природе.

Для clearify:

Когда я совместить это в var_dump с оператором побитового, то он возвращает Int (0). Зачем?

Явно неправильно, он возвращает int(1).

+0

'1 & 1 = 1'. '&' не возвращает «позицию», он возвращает новый байт, в котором все биты, которые установлены в * оба * операнда, установлены, а все остальные бит - нет. Все биты в '1' и' 1' одинаковы, поэтому результат равен «1». '2 & 3' приведет к' 2'. – deceze

+0

Извините, бровь, то я догадываюсь, что я никогда не реализовал бит-поля раньше, и интерпретатор PHP тоже не прав: http://3v4l.org/kYjUO И как бы вы объяснили, что '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ' «' '? – deceze

+0

Итак, вы правы в отношении результата: 1 вместо 0 (я просто скопировал вывод OPs немой, а не тестировал себя), но он не является логическим, он по-прежнему является позицией одинаковых бит – DanFromGermany

Смежные вопросы