Когда я должен использовать побитовый оператор? - PullRequest
18 голосов
/ 16 января 2011

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

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

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

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

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

Ответы [ 9 ]

23 голосов
/ 17 января 2015

Побитовая полезна для вещей в 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";
14 голосов
/ 16 января 2011

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

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

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
}
5 голосов
/ 07 сентября 2012

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

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

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

if(func1() && func2())

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

if(func1() & func2())

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

5 голосов
/ 16 января 2011

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

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

3 голосов
/ 16 января 2011

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

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

2 голосов
/ 23 ноября 2018

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

Хорошо, теперь скажем, что у вас есть несколько разных ролей: admin , user и guest .

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

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

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

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

1 голос
/ 16 января 2011

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

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

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

0 голосов
/ 19 сентября 2014

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

http://www.bitwiseoperatorcalculator.com/

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

0 голосов
/ 16 января 2011

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...