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

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

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

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

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

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

9 ответов

Решение

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

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

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 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";

Забудь, что уже у тебя в голове.

Хорошо, теперь скажите, что у вас есть разные роли: администратор, пользователь и гость.

и несколько разных разрешений: чтение, запись и удаление

Давайте создадим несколько битовых масок для разрешений и ролей. Битовая маска - это последовательность битов, которую можно использовать для манипулирования или чтения каких-либо флагов. Как показано ниже:

// 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)

Так почему же побитовая операция? Одним словом, побитовая операция более быстрая, лаконичная и обслуживаемая. В противном случае использование побитовой операции всегда эффективно для сложных приложений.

Побитовые операторы специально используются в случае представления двоичных значений.

echo '0110011010' & '0101001001'; 
//0100001000

Логические операторы являются наиболее предпочтительными для сравнения и немного быстрее, чем побитовый оператор в случае AND а также XOR операции.

if(func1() && func2())

если func1() возвращает false, звонить не будет func2()

if(func1() & func2())

Вызовет обе функции независимо от их возвращаемых значений.

В большинстве случаев вы, вероятно, захотите использовать логические операторы. Они используются для объединения логических условий, как правило, для управления потоком программ, например ($isAlive && $wantsToEat),

Побитовые операторы используются, когда вы хотите выполнять побитовые операции над базовыми двоичными представлениями целых чисел. например (5 & 3) == 7, Как и предполагали другие, в приложениях, которые обычно пишутся на PHP, обычно не так много вызовов для этого (хотя есть и языки более низкого уровня, такие как C).

Побитовые операторы полезны при манипулировании битами числа. Посмотри здесь В противном случае вы должны использовать логические операторы. Также логические операторы закорочены. Например, если у вас есть a && b а также a является false, b не оценивается.

Отказ от ответственности: я пришел из Java, но я думаю, что в PHP это то же самое.

Это два совершенно разных оператора.

Когда вы хотите, чтобы два условия одновременно выполнялись, вы используете логическое &&, Например, я хочу распечатать "с днем ​​рождения", только если у человека сегодня день рождения, и у него есть деньги на счете. Это используется всякий раз, когда мы хотим выполнить композицию из двух или более условий, в основном в операторах if и условиях цикла (хотя и не исключительно).

Когда вы хотите выполнить побитовые операции (что в повседневном программировании на PHP гораздо реже), вы используете побитовые &, Это гораздо реже, и вы можете выполнять побитовое маскирование (хотя я сомневаюсь в этом), поэтому вам может потребоваться только результат, который представляют оба целых числа, и в этом случае вы можете сказать, newAttribute = attribute1 & attribute2;,

Ну, если есть $x = (false && some_function());Здесь значение $x будет установлен без вызова some_function() потому что первое значение было ЛОЖЬ.

Но что, если вам все равно понадобится вызвать эту функцию? использование $x = (false & some_function());,

Другими словами, & использует БОЛЬШЕ обработки, чем &&, просто потому, что && не просматривает все значения для их проверки. Если он найдет одно значение как ложное, он вернет его, не глядя на другие значения.

И в логических операциях используйте && оператор, поскольку он используется для возврата значения логической операции, где & используется для установки значения и в if Заявление всегда вернет истину.

Если вы хотите узнать больше, как это работает, посетите этот сайт:

http://www.bitwiseoperatorcalculator.com/

Исходя из PHP, я никогда не использовал его раньше, но просто читая для развлечения этот сайт дает простые объяснения!

Другие вопросы по тегам