Я читаю следующие вопросы о переполнении стека, и я понимаю различия между поразрядными и логическими.
Разница между & и && в PHP
Ссылка. Что означает этот символ в PHP?
Однако ни один из них не объясняет, когда я должен использовать поразрядное или логическое.
Когда следует использовать побитовые операторы, а не логические, и наоборот?
В какой ситуации мне нужно сравнивать пополам?
Я не спрашиваю о различиях, но я спрашиваю ситуацию, когда вам нужно использовать побитовые операторы.
Побитовое |
и &
и логические ||
и &&
совершенно разные .
Побитовые операторы выполняют операции над битами двух чисел и возвращают результат. Это означает, что это не да или нет. Если они используются в условных выражениях, они часто используются как часть логических сравнений. Например:
if ($x & 2 == 2) { // The 2^1 bit is set in the number $x }
Логические операторы сравнивают два (или более) условия / выражения и возвращают true или false. Вы используете их чаще всего в условных выражениях, например, if
и в while
. Например:
if ($either_this || $or_this) { // Either expression was true }
Побитово полезно для вещей на PHP, как и все остальное.
Как насчет значения, которое может включать несколько состояний одновременно (возможно, разрешения)?
<?php # must double them like this for it to work. const STATE_FOO = 1; const STATE_BAR = 2; const STATE_FEZ = 4; const STATE_BAZ = 8; # set state to foo and bar $state = STATE_FOO | STATE_FEZ; echo "What's the value: $state\n"; echo "Is foo state on? ".(bool)($state & STATE_FOO)."\n"; echo "Is bar state on? ".(bool)($state & STATE_BAR)."\n"; echo "Is fez state on? ".(bool)($state & STATE_FEZ)."\n"; echo "Is baz state on? ".(bool)($state & STATE_BAZ)."\n"; echo "Is foo and fez state on? ".($state == (STATE_FOO | STATE_FEZ))."\n";
В большинстве случаев вы, вероятно, захотите использовать логические операторы. Они используются для объединения логических условий, как правило, для управления потоком программы, например ($isAlive && $wantsToEat)
.
Побитовые операторы используются, когда вы хотите выполнять операции поэтапно на основе двоичных представлений целых чисел. например (5 & 3) == 7
. Как предполагали другие, в этом случае обычно не так много призывов в виде приложения, которое, как правило, записывается на PHP (хотя есть языки более низкого уровня, например C).
Побитовые операторы специально используются в случае представления двоичных значений.
echo '0110011010' & '0101001001'; //0100001000
Логические операторы наиболее предпочтительны для сравнения и немного быстрее, чем побитовый оператор в случае операций AND
и XOR
.
if(func1() && func2())
if func1()
возвращает false, это не func2()
вызов func2()
if(func1() & func2())
Вызовите обе функции независимо от возвращаемых значений.
Побитовые операторы полезны при манипулировании битами числа. Послушайте. В противном случае вы должны использовать логические операторы. Также логические операторы закорочены. Например, если у вас есть a && b
а a
– false
, b
не оценивается.
Отказ от ответственности: я исхожу из Java- фона, но я думаю, что в PHP это одно и то же.
Это два очень разных оператора.
Если вы хотите, чтобы два условия одновременно были истинными, вы используете логический &&
. Например, я хочу распечатать «с днем рождения», только если сегодня день рождения человека и у него есть деньги на счете. Это используется всякий раз, когда мы хотим выполнить композицию из двух или более условий, в основном в операторах if и условиях цикла (хотя и не исключительно).
Если вы хотите выполнять побитовые операции (которые в повседневном программировании PHP намного реже), вы используете побитовое &
. Это гораздо реже, и вы можете выполнять побитовое маскирование (я сомневаюсь, однако), поэтому вам может newAttribute = attribute1 & attribute2;
только результат, который представляют оба целых числа, и в этом случае вы можете сказать newAttribute = attribute1 & attribute2;
,
Ну, предполагая, что существует $x = (false && some_function());
, здесь значение $x
будет установлено без вызова функции some_function()
поскольку первое значение было FALSE.
Но что, если вам нужно было все время называть эту функцию? Используйте $x = (false & some_function());
,
Другими словами, &
использует БОЛЬШУЮ обработку, чем &&, только потому, что && не пробегает все значения, чтобы их проверить. Если он обнаружил одно значение как false, оно вернет его, не глядя на другие значения.
И в логических операциях используйте оператор &&
поскольку он используется для возврата значения логической операции, где &
используется для установки значения, и в выражении if
он всегда возвращает true.
Если вы хотите узнать больше, как это работает, ознакомьтесь с этим сайтом:
http://www.bitwiseoperatorcalculator.com/
Исходя из PHP, я никогда раньше не использовал его, но просто читал для удовольствия этот сайт дает простые объяснения!