Когда следует использовать побитовый оператор?
Я прочитал следующие вопросы переполнения стека, и я понимаю различия между побитовым и логическим.
Однако ни один из них не объясняет, когда я должен использовать побитовое или логическое.
Когда следует использовать побитовые операторы вместо логических и наоборот?
В какой ситуации я нужно сравнивать по крупицам?
Я не спрашиваю о различиях, но я спрашиваю о ситуации, когда вам нужно использовать побитовые операторы.
8 ответов:
Побитовые
Побитовые операторы|
и&
и логические||
и&&
являютсясовершенно разными .Выполняют операции над битамидвух чисел и возвращают результат. Это значит, что это не вопрос " да " или "нет". Если они используются в условных операторах, они часто используются как часть логических сравнений. Например:
Логические операторы сравнивают два (или более) условия / выражения и возвращают значение true или false. Вы используете их больше всего обычно в условных выражениях, таких какif ($x & 2 == 2) { // The 2^1 bit is set in the number $x }
if
иwhile
. Например:if ($either_this || $or_this) { // Either expression was true }
Bitwise полезен для вещей в 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 fez $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 (хотя есть и на более низком уровне языки, например с).
Побитовые операторы специально используются в случае двоичного представления значений.
Логические операторыecho '0110011010' & '0101001001'; //0100001000
Наиболее предпочтительны для сравнения и немного быстрее, чем побитовые операторы в случае операций
AND
иXOR
.if(func1() && func2())
Если
func1()
возвращает false, то вызовfunc2()
if(func1() & func2())
Вызовет обе функции независимо от их возвращаемых значений.
Побитовые операторы полезны при манипулировании битами числа. Смотрите здесь . В противном случае следует использовать логические операторы. Также происходит короткое замыкание логических операторов. Например, если у вас
a && b
иa
Естьfalse
,b
не оценивается.Отказ от ответственности: я исхожу изJava фона, но я предполагаю, что вPHP это то же самое.
Это два очень разных оператора.
Если вы хотите, чтобы два условия одновременно были истинными, вы используете логическое&&
. Например, я хочу распечатать "happy birthday" только в том случае, если у человека сегодня день рождения и у него есть деньги на счету. Это используется всякий раз, когда мы хотим выполнить композицию из двух или более условий, в основном в операторах if и условиях цикла (хотя и не исключительно).Когда вы хотите выполнять побитовые операции (которые в повседневном PHP Программирование встречается гораздо реже), вы используете побитовое
&
. Это гораздо реже, и вы можете выполнять побитовую маскировку (хотя я в этом сомневаюсь), поэтому вам может понадобиться только результат, который представляют оба целых числа, и в этом случае вы можете сказатьnewAttribute = attribute1 & attribute2;
.
Ну а так как есть
$x = (false && some_function());
, то здесь значение$x
будет задано без вызоваsome_function()
, так как первое значение было ложным.Но что, если вам все равно придется вызывать эту функцию? Используйте
Другими словами,$x = (false & some_function());
.&
использует больше обработки, чем&&, просто потому, что && не проходит через все значения, чтобы проверить их. Если бы он нашел одно значение как false, он вернул бы его, не глядя на другие значения.И в логических операциях используйте оператор
&&
в качестве используется для возврата значения логической операции, где&
используется для задания значения, и в оператореif
оно всегда будет возвращать true.
Если вы хотите узнать больше, как это работает, проверьте этот сайт:
Http://www.bitwiseoperatorcalculator.com/
Исходя из PHP, я никогда не использовал его раньше, но просто читаю для удовольствия этот сайт дает простые объяснения!