traduccion operadores logicos desplazamiento derecha bitwise binarios php bitwise-operators logical-operators

php - logicos - operadores de bits en c



¿Cuándo debo usar un operador bitwise? (9)

Bitwise | y & y lógico || y && son totalmente diferentes .

Los operadores bitwise realizan operaciones en los bits de dos números y devuelven el resultado. Eso significa que no es una cosa de sí o no. Si se usan en sentencias condicionales, a menudo se usan como parte de comparaciones lógicas. Por ejemplo:

if ($x & 2 == 2) { // The 2^1 bit is set in the number $x }

Los operadores lógicos comparan dos (o más) condiciones / expresiones y devuelven verdadero o falso. Los usas más comúnmente en sentencias condicionales, como if y while . Por ejemplo:

if ($either_this || $or_this) { // Either expression was true }

Leí las siguientes preguntas de desbordamiento de pila y comprendo las diferencias entre bitwise y lógico.

Sin embargo, ninguno de ellos explica cuándo debo usar bitwise o lógico.

¿Cuándo debo usar operadores bitwise en lugar de lógicos y viceversa?

¿En qué situación debo comparar poco a poco?

No estoy preguntando por las diferencias, pero estoy preguntando la situación cuando necesita utilizar operadores de bitwise.


Bitwise es útil para cosas en PHP como cualquier otra cosa.

¿Qué tal un valor que puede tener varios estados activados al mismo tiempo (tal vez permisos)?

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


Bueno, asumiendo que hay $x = (false && some_function()); Aquí, el valor de $x se establecerá sin llamar a some_function() porque el primer valor fue FALSO.

¿Pero qué pasa si necesitas llamar a esa función de todos modos? Use $x = (false & some_function()); .

En otras palabras, el & usa más procesamiento que el &&, solo porque && no ejecuta todos los valores para verificarlos. Si encuentra un valor como falso, lo devolverá, sin mirar otros valores.

Y en operaciones lógicas, use el operador && como se usa para devolver el valor de la operación lógica, donde & se usa para establecer un valor y en una instrucción if siempre devolverá verdadero.


En la mayoría de los casos, es probable que desee utilizar operadores lógicos. Se utilizan para combinar condiciones lógicas, generalmente para controlar el flujo del programa, por ejemplo, ($isAlive && $wantsToEat) .

Los operadores bitwise se utilizan cuando desea realizar operaciones bit a bit en las representaciones binarias subyacentes de los enteros. por ejemplo, (5 & 3) == 7 . Como otros lo han sugerido, generalmente no hay mucha demanda para esto en el tipo de aplicación que tiende a escribirse en PHP (aunque existe en lenguajes de nivel inferior, como C).


Los operadores bitwise se utilizan específicamente en caso de representación de valor binario.

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

Los operadores lógicos son los más preferidos para la comparación y son un poco más rápidos que los operadores a nivel de bit en caso de operaciones AND y XOR .

if(func1() && func2())

si func1() devuelve falso no molestará en llamar a func2()

if(func1() & func2())

Llamará a ambas funciones independientemente de sus valores devueltos.


Los operadores bitwise son útiles cuando se manipulan los bits de un número. Mira here De lo contrario, debe utilizar los operadores lógicos. También los operadores lógicos están cortocircuitados. Por ejemplo, si tiene a && b y a es false , b no se evalúa.

Descargo de responsabilidad: vengo de un fondo de Java , pero supongo que en PHP es lo mismo.


Si quieres saber más sobre cómo funciona, visita este sitio:

http://www.bitwiseoperatorcalculator.com/

Desde PHP, nunca lo he usado antes, ¡pero solo por diversión, este sitio ofrece explicaciones simples!


Son dos operadores muy diferentes.

Cuando quiere que dos condiciones se cumplan simultáneamente, use la lógica && . Por ejemplo, quiero imprimir "feliz cumpleaños" solo si el cumpleaños de la persona es hoy y tiene dinero en la cuenta. Esto se usa cuando queremos realizar una composición de dos o más condiciones, principalmente en sentencias if y condiciones de bucle (aunque no exclusivamente).

Cuando desee realizar operaciones bitwise (que en la programación PHP diaria es mucho más raro), use el bit & . Esto es mucho más raro, y es posible que esté realizando un enmascaramiento a nivel de bits (aunque lo dudo), por lo que es posible que solo desee un resultado que representen ambos enteros, en cuyo caso puede decir newAttribute = attribute1 & attribute2; .


Olvida lo que ya está en tu cabeza.

Bien, ahora digamos que tienes algunos roles diferentes: administrador , usuario e invitado .

y algunos permisos diferentes: leer , escribir y borrar

Vamos a crear algunas máscaras de bits para permisos y roles . Una máscara de bits es una secuencia de bits que puede utilizarse para manipular o leer algún tipo de indicadores . Como se muestra abajo:

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

Aviso 1, 2, 4. Esto debe ser elevado como doble. De lo contrario, podría darte algunos resultados incómodos.

Olvídate de las cosas comentadas. Esos son solo una secuencia de bits (o máscaras de bits) para permisos y roles individuales.

Ahora vamos a crear una función práctica que se puede usar para verificar un permiso específico para un rol específico.

function isAllowed($role, $permissison) { return $role & $permissison ? true : false; }

Hemos terminado. Revisemos el permiso $ delete para los 3 roles:

var_dump(isAllowed($admin, $delete)); // bool(true) var_dump(isAllowed($user, $delete)); // bool(false) var_dump(isAllowed($guest, $delete)); // bool(false)

Entonces, ¿por qué es la operación bitwise? En una palabra, la operación a nivel de bits es más rápida, concisa y mantenible. De lo contrario, el uso de bitwise es siempre eficiente para aplicaciones complejas.