2011-01-16 7 views
13

He leído las siguientes preguntas sobre desbordamiento de pila, y entiendo las diferencias entre bitwise y logical.¿Cuándo debería usar un operador bit a bit?

Sin embargo, ninguno de ellos explica cuando debería usar bit a bit o lógica.

¿Cuándo debería usar operadores bit a bit en lugar de lógicos y viceversa?

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

No estoy preguntando sobre las diferencias, pero estoy preguntando la situación en la que necesita usar operadores bit a bit.

+2

Uno es una función matemática, el otro es un operador booleano. – mario

+0

Un uso podría ser encontrar el número impar: '$ number = [1, 2, 3, 4, 5]; foreach ($ number as $ num) {if ($ num & 1) {echo $ num. "es un número impar!
"; }}; ' – Ahmad

Respuesta

12

Bitwise | y & y lógica || y && son totalmente diferente.

Los operadores bit a bit realizan operaciones en los bits de dos números y devuelven el resultado. Eso significa que no es un sí o nada. Si se usan en declaraciones 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 usa con mayor frecuencia en declaraciones condicionales, como if y while. Por ejemplo:

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

Los operadores de bit a bit son útiles al manipular los bits de un número. Mire here. De lo contrario, debe usar los operadores lógicos. También los operadores lógicos están en cortocircuito. Por ejemplo, si tiene a && b y a es false, b no se evalúa.

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

5

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

Los operadores de bit a bit se usan cuando se quieren realizar operaciones bit por bit en las representaciones binarias subyacentes de los enteros. p.ej. (5 & 3) == 7. Como otros han sugerido, generalmente no hay mucha demanda de este tipo en el tipo de aplicación que tiende a escribirse en PHP (aunque existe en idiomas de nivel inferior, como C).

1

Son dos operadores muy diferentes.

Cuando quiere que dos condiciones sean simultáneas, usa el && lógico.Por ejemplo, quiero imprimir "feliz cumpleaños" solo si el cumpleaños de la persona es hoy & & tienen 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 bit a bit (lo que en la programación PHP cotidiana es mucho más raro), utilice el bit &. Esto es mucho más raro, y es posible que esté realizando enmascaramiento bit a bit (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;.

0

Bueno, suponiendo que hay $x = (false && some_function());, aquí el valor de $x se configurará sin llamar al some_function() porque el primer valor fue FALSE.

Pero, ¿y si necesitaras llamar a esa función de todos modos? Use $x = (false & some_function());.

En otras palabras, el & utiliza más que el procesamiento & &, sólo porque & & no se ejecuta a través de todos los valores para comprobar ellos. Si encontraba un valor como falso, lo devolvería, sin mirar otros valores.

Y en operaciones lógicas, utilice el operador && que se utiliza para devolver el valor operación lógica, donde & se utiliza para establecer un valor y en un comunicado if siempre devolverá true.

5

Los operadores de bit a bit se utilizan específicamente en caso de representación de valores binarios.

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

Los operadores lógicos son los más preferidos para la comparación y son un poco más rápido que el operador de bits en el caso de AND y XOR operaciones.

if(func1() && func2()) 

si func1() vuelve falsa que no se molestará llamando func2()

if(func1() & func2()) 

Llamará ambas funciones, independientemente de sus valores devueltos.

18

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

¿Qué tal un valor que puede tener múltiples estados activados al mismo tiempo (quizás 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 bar 
$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"; 
Cuestiones relacionadas