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

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

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

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

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

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

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