Когда следует использовать побитовый оператор?
Я прочитал следующие вопросы, и я понимаю различия между поразрядными и логическими.
Однако ни один из них не объясняет, когда я должен использовать поразрядное или логическое.
Когда следует использовать побитовые операторы, а не логические, и наоборот?
В какой ситуации мне нужно сравнивать пополам?
Я не спрашиваю о различиях, но я спрашиваю ситуацию, когда вам нужно использовать побитовые операторы.
Ответы
Ответ 1
Побитовые |
и &
и логические ||
и &&
полностью разные.
Побитовые операторы выполняют операции над битами двух чисел и возвращают результат. Это означает, что это не да или нет. Если они используются в условных выражениях, они часто используются как часть логических сравнений. Например:
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
}
Ответ 2
Побитовая полезность для вещей в PHP, как и все остальное.
Как насчет значения, в которое может быть включено несколько состояний одновременно?
<?php
// since we're setting constant values in base10 we must progressively double
// them since bitwise operations work in base2. you'll see why when we output
// these as binary values below.
const STATE_FOO = 1;
const STATE_BAR = 2;
const STATE_FEZ = 4;
const STATE_BAZ = 8;
// show base2 values of the above constants
echo sprintf("STATE_FOO base2 value is %08d\n", decbin(STATE_FOO));
echo sprintf("STATE_BAR base2 value is %08d\n", decbin(STATE_BAR));
echo sprintf("STATE_FEZ base2 value is %08d\n", decbin(STATE_FEZ));
echo sprintf("STATE_BAZ base2 value is %08d\n\n", decbin(STATE_BAZ));
// set state to FOO and FEZ
$state = STATE_FOO | STATE_FEZ;
echo sprintf("base10 value of \$state is %s\n", $state);
echo sprintf("base2 value of \$state is %08d\n", decbin($state));
echo sprintf("Does \$state include FOO state? %s\n", (bool)($state & STATE_FOO));
echo sprintf("Does \$state include BAR state? %s\n", (bool)($state & STATE_BAR));
echo sprintf("Does \$state include FEZ state? %s\n", (bool)($state & STATE_FEZ));
echo sprintf("Does \$state include BAZ state? %s\n", (bool)($state & STATE_BAZ));
echo sprintf("Is state equivalent to FOO and FEZ states? %s\n", ($state == (STATE_FOO | STATE_FEZ)));
Выход:
STATE_FOO base2 value is 00000001
STATE_BAR base2 value is 00000010
STATE_FEZ base2 value is 00000100
STATE_BAZ base2 value is 00001000
base10 value of $state is 5
base2 value of $state is 00000101
Does $state include FOO state? 1
Does $state include BAR state?
Does $state include FEZ state? 1
Does $state include BAZ state?
Is state equivalent to FOO and FEZ states? 1
Ответ 3
В большинстве случаев вы, вероятно, захотите использовать логические операторы. Они используются для объединения логических условий, как правило, для управления потоком программы, например. ($isAlive && $wantsToEat)
.
Побитовые операторы используются, когда вы хотите выполнять операции поэтапно на основе двоичных представлений целых чисел. например (5 & 3) == 7
. Как предлагали другие, обычно не так много призывов к этому в своем приложении, которое, как правило, написано на PHP (хотя есть языки более низкого уровня, такие как C).
Ответ 4
Поврежденные операторы специально используются в случае представления двоичных значений.
echo '0110011010' & '0101001001';
//0100001000
Логические операторы наиболее предпочтительны для сравнения и немного быстрее, чем побитовый оператор в случае операций AND
и XOR
.
if(func1() && func2())
если func1()
возвращает false, это не вызовет вызов func2()
if(func1() & func2())
Вызвать обе функции независимо от возвращаемых значений.
Ответ 5
Побитовые операторы полезны при манипулировании битами числа. Посмотрите здесь. В противном случае вы должны использовать логические операторы. Также логические операторы закорочены. Например, если у вас a && b
и a
есть false
, b
не оценивается.
Отказ от ответственности: я исхожу из фона Java, но я думаю, PHP, это то же самое.
Ответ 6
Забудь, что уже у тебя в голове.
Хорошо, теперь скажите, что у вас есть разные роли: администратор, пользователь и гость.
и некоторые другие разрешения: читать, писать и удалять
Давайте создадим несколько битовых масок для разрешений и ролей. Битовая маска - это последовательность битов, которую можно использовать для манипулирования или чтения каких-либо флагов. Как показано ниже:
// flags bitmasks
$read = 1; // 0001
$write = 2; // 0010
$delete = 4; // 0100
$admin = $read | $write | $delete; // 0001 | 0010 | 0100 => 0111
$user = $read | $write; // 0001 | 0010 => 0011
$guest = $read; // 0001 => 0001
Уведомление 1, 2, 4. Это должно быть поднято как двойное. В противном случае это может привести к некоторым неловким результатам.
Забудьте о комментируемых вещах. Это просто последовательность битов (или битовых масок) для отдельных разрешений и ролей.
Теперь давайте создадим удобную функцию, которая может использоваться для проверки определенного разрешения для конкретной роли.
function isAllowed($role, $permissison) {
return $role & $permissison ? true : false;
}
Мы сделали. Давайте проверим разрешение $ delete для всех 3 ролей:
var_dump(isAllowed($admin, $delete)); // bool(true)
var_dump(isAllowed($user, $delete)); // bool(false)
var_dump(isAllowed($guest, $delete)); // bool(false)
Так почему же побитовая операция? Одним словом, побитовая операция более быстрая, лаконичная и обслуживаемая. В противном случае использование побитовой операции всегда эффективно для сложных приложений.
Ответ 7
Это два очень разных оператора.
Если вы хотите, чтобы два условия одновременно были истинными, вы используете логический &&
. Например, я хочу распечатать "с днем рождения" только в том случае, если сегодня день рождения человека и & у них есть деньги на счете. Это используется всякий раз, когда мы хотим выполнить композицию из двух или более условий, в основном в операторах if и условиях цикла (хотя и не исключительно).
Если вы хотите выполнять побитовые операции (которые в повседневном программировании PHP намного реже), вы используете побитовое &
. Это гораздо реже, и вы можете выполнять побитовое маскирование (я сомневаюсь, однако), поэтому вам может потребоваться только результат, который представляют оба целых числа, и в этом случае вы можете сказать newAttribute = attribute1 & attribute2;
.
Ответ 8
Ну, если есть $x = (false && some_function());
, здесь значение $x
будет установлено без вызова some_function()
, потому что первое значение было FALSE.
Но что, если вам нужно было все-таки вызвать эту функцию? Используйте $x = (false & some_function());
.
Другими словами, &
использует БОЛЬШУЮ обработку, чем & &, только потому, что && & не проверяет все значения. Если он нашел одно значение как false, он вернет его, не глядя на другие значения.
И в логических операциях используйте оператор &&
, как он использовал для возврата значения логической операции, где &
используется для установки значения, а в выражении if
он всегда возвращает true.
Ответ 9
Если вы хотите узнать больше, как это работает, проверьте этот сайт:
http://www.bitwiseoperatorcalculator.com/
Исходя из PHP, я никогда раньше не использовал его, но просто читал для удовольствия этот сайт дает простые объяснения!