Когда следует использовать побитовый оператор?


Я прочитал следующие вопросы переполнения стека, и я понимаю различия между побитовым и логическим.

Однако ни один из них не объясняет, когда я должен использовать побитовое или логическое.

Когда следует использовать побитовые операторы вместо логических и наоборот?

В какой ситуации я нужно сравнивать по крупицам?

Я не спрашиваю о различиях, но я спрашиваю о ситуации, когда вам нужно использовать побитовые операторы.

8 16

8 ответов:

Побитовые | и & и логические || и && являютсясовершенно разными .

Побитовые операторы

Выполняют операции над битамидвух чисел и возвращают результат. Это значит, что это не вопрос " да " или "нет". Если они используются в условных операторах, они часто используются как часть логических сравнений. Например:

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
}

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, я никогда не использовал его раньше, но просто читаю для удовольствия этот сайт дает простые объяснения!