Когда я должен использовать побитовый оператор?
Я прочитал следующие вопросы о переполнении стека и понимаю разницу между побитовым и логическим.
Тем не менее, ни один из них не объясняет, когда я должен использовать побитовое или логическое.
Когда я должен использовать побитовые операторы, а не логические и наоборот?
В какой ситуации мне нужно сравнивать по крупицам?
Я не спрашиваю о различиях, но я спрашиваю ситуацию, когда вам нужно использовать побитовые операторы.
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, я никогда не использовал его раньше, но просто читая для развлечения этот сайт дает простые объяснения!