operadores - php operador logico or
Comprender PHP &(ampersand, bitwise and) operator (5)
& es binario and
. Si tiene un valor binario, y usted and
con otro valor binario, entonces el resultado será el bit a bit and
de los dos. Un ejemplo:
01101010
& 01011001
= 01001000
El bit más a la derecha es un 1 (y en ese caso el número es un número impar) o es un 0, en cuyo caso el número es par. Si usted &
un número con 1, solo mira el bit menos significativo, y si comprueba si el número es 1 o 0. Como han mencionado otros, mire a los operadores bit a bit para obtener información sobre cómo funcionan.
A menudo uso ($var & 1)
en mi código, que devuelve verdadero si $var
es un número impar y falso si es un número par.
¿Pero qué hace "y" realmente?
Además de las otras respuestas, vale la pena señalar que
if(func1() && func2())
Solo invocará func2()
si func1()
devuelve verdadero ("evaluación diferida"), mientras que
if(func1() & func2())
Llamará a ambas funciones independientemente, pero las tablas de verdad para ambos serán las mismas (suponiendo que devuelvan booleanos).
thomasrutter señala (en los comentarios a continuación) que probablemente no deberías hacer esto último en la práctica. (A & B)
no necesariamente tendrán la misma veracidad que (A && B)
, particularmente cuando A
y B
son números enteros. por ejemplo, si A = 1 y B = 2 (ambos son verdaderos), A y B falsey, mientras que A & B es verdad. Además, otro desarrollador puede pensar que se trata de un error tipográfico y ''corregir'' a dos ampersands.
Dos operaciones que son fundamentales para los sistemas binarios son OR y AND.
O significa ''si A está encendido o B está encendido''. Un ejemplo del mundo real sería dos interruptores en paralelo. Si cualquiera permite la corriente, la corriente pasa.
Y significa ''si ambos A y B están activados''. El ejemplo del mundo real es dos interruptores en serie. La corriente solo pasará si ambos permiten la corriente.
En una computadora, estos no son interruptores físicos sino semiconductores, y su funcionalidad se llama puertas lógicas . Hacen las mismas cosas que los interruptores: reaccionan a la corriente o no a la corriente.
Cuando se aplica a enteros, cada bit en un número se combina con cada bit en el otro número. Entonces, para entender los operadores de bit O y Y, necesitas convertir los números a binarios, luego haz la operación OR o AND en cada par de bits coincidentes.
Es por eso que:
00011011 (odd number)
AND
00000001 (& 1)
==
00000001 (results in 1)
Mientras
00011010 (even number)
AND
00000001 (& 1)
==
00000000 (results in 0)
Por lo tanto, la operación (& 1) compara el bit del extremo derecho con 1 usando la lógica AND. Todos los otros bits son ignorados efectivamente porque cualquier cosa Y nada es nada. Un número par en binario también es un número par en notación decimal (10 es un múltiplo de 2).
Otras operaciones fundamentales de los sistemas binarios incluyen NOT y XOR. NO significa ''si A está desactivado'' y es la única forma de puerta lógica que toma solo una señal o ''parámetro'' en lugar de dos. XOR significa ''si A o B están activados, pero no ambos''. Y luego están NAND, NOR y NXOR, que básicamente NO se combinan con AND, OR y XOR, es decir, NAND significa ''si A y B no están ambos encendidos''.
En la programación, el operador
& means AND,
| means OR,
~ means NOT, and
^ means XOR.
Los otros se pueden inventar combinando estos, por ejemplo:
~ (a & b) is equivalent to a NAND operation
Nota específica de PHP
Los operadores bit a bit no trabajan en valores de coma flotante, y en PHP los valores flotantes se convertirán implícitamente en enteros primero. Los números fuera del rango que se pueden expresar como enteros se truncarán a cero, es decir, todos los números sobre PHP_INT_MAX se verán "pares" en la expresión ($num & 1)
). Si desea admitir números fuera de PHP_INT_MIN / PHP_INT_MAX, necesitará fmod($num, 2)
. Sin embargo, si tienes PHP de 64 bits, tus enteros tendrán una mayor precisión que los flotantes de todos modos.
Sé que su pregunta es sobre la comprensión del operador bit a bit y la respuesta aceptada lo explica bien. Pero por el ejemplo que das, no puedo evitar recomendarte que uses el operador de módulo en su lugar:
($var % 2) /* instead of */ ($var & 1)
Porque deja clara la intención de que está comprobando que el número es impar (no divisible por dos), y es más genérico, por lo que puede usar ($ var% 3) de la misma manera y deducir cómo funciona para cualquier N.
También es interesante saber sobre bitwise y PHP:
/**
* Regular
*/
echo (true && true); // 1
echo (true && false); // nothing
echo (true || false); // 1
echo (false || false); // nothing
echo (true xor false); // 1
echo (false xor false); // nothing
/**
* Bitwise
*/
echo (true & true); // 1
echo (true & false); // 0
echo (true | false); // 1
echo (false | false); // 0
echo (true ^ false); // 1
echo (false ^ false); // 0