Operaciones a Nivel de Bit
Cuando vimos los condicionales, hablamos de operadores lógicos && (and), || (or), y xor (or exclusivo).
Existen unas variantes de estos operadores llamadas operadores a nivel de bit.
Usted sabe que cualquier valor es manejado internamente por el ordenador con unos y ceros "código binario", cada uno de estos unos y ceros es un bit, la unidad de información minim que puede manejar un ordenador.
En PHP, nosotros podemos trabajar con dos o mas valores a nivel de bit. Para ello contamos con tres operadores que son los siguientes:
- Operador &
- El cual comprueba cada bit de un valor con el correspondiente bit de otro.
- Si ambos son 1, el resultado de ese bit es 1.
- En caso contrario el resultado es cero.
- Operador |
- Comprueba cada bit de un valor con el correspondiente bit de otro.
- Si uno de los dos es uno, o lo son ambos, el resultado de ese bit es uno.
- En caso contrario el resultado es cero.
- Operador ^
- Comprueba cada bit de un valor con el correspondiente bit de otro.
- Si uno de los dos es uno y el otro es cero, el resultado de ese bit es 1, en caso contrario es cero
- Es decir, el resultado es uno si los dos son bits diferentes y cero si son iguales
Veamos la siguiente tabla donde se muestran algunos ejemplos de operaciones bit a bit.
Ejemplo
|
Nombre
|
Resultado
|
$a & $b |
And (y)
|
Los bits que están activos en ambos $a y $b son activados.
|
$a | $b |
Or (o inclusivo)
|
Los bits que están activos ya sea en $a o en $b son activados.
|
$a ^ $b |
Xor (o exclusivo)
|
Los bits que están activos en $a o en $b,
pero no en ambos, son activados.
|
~ $a |
Not (no)
|
Los bits que están activos en $a son desactivados, y viceversa.
|
$a << $b |
Shift left(desplazamiento a izquierda)
|
Desplaza los bits de $a, $b pasos a la izquierda (cada paso
quiere decir "multiplicar por dos").
|
$a >> $b |
Shift right (desplazamiento a derecha)
|
Desplaza los bits de $a, $b pasos a la derecha (cada paso quiere
decir "dividir por dos").
|
Ejemplo 1 de Operaciones a nivel de Bit
<?php /* * Ignore la sección superior, * es sólo el formateado para hacer la salida más clara. */ $format = '(%1$2d = %1$04b) = (%2$2d = %2$04b)' . ' %3$s (%4$2d = %4$04b)' . "\n"; echo <<<EOH --------- --------- -- --------- resultado valor op prueba --------- --------- -- --------- EOH; /* * Aquí están los ejemplos. */ $values = array(0, 1, 2, 4, 8); $test = 1 + 4; echo "\n AND bit a bit \n"; foreach ($values as $value) { $result = $value & $test; printf($format, $result, $value, '&', $test); } echo "\n OR inclusivo bit a bit \n"; foreach ($values as $value) { $result = $value | $test; printf($format, $result, $value, '|', $test); } echo "\n OR exclusivo (XOR) bit a bit \n"; foreach ($values as $value) { $result = $value ^ $test; printf($format, $result, $value, '^', $test); } ?>
Ejemplo 2 de Operaciones a nivel de Bit
<?php echo 12 ^ 9; // Sale '5' echo "12" ^ "9"; // Sale el caracter de retroceso (ascii 8) // ('1' (ascii 49)) ^ ('9' (ascii 57)) = #8 echo "hallo" ^ "hello"; // Salen los valores ascii #0 #4 #0 #0 #0 // 'a' ^ 'e' = #4 echo 2 ^ "3"; // Sale 1 // 2 ^ ((int)"3") == 1 echo "2" ^ 3; // Sale 1 // ((int)"2") ^ 3 == 1 ?>
Ejemplo 3 de Operaciones a nivel de Bit
<?php /* * Aquí están los ejemplos. */ echo "\n--- DESPLAZAMIENTO DE BITS A LA DERECHA SOBRE ENTEROS POSITIVOS ---\n"; $val = 4; $places = 1; $res = $val >> $places; p($res, $val, '>>', $places, 'copia del bit de signo desplazado hacia el lado izquierdo'); $val = 4; $places = 2; $res = $val >> $places; p($res, $val, '>>', $places); $val = 4; $places = 3; $res = $val >> $places; p($res, $val, '>>', $places, 'bits desplazados fuera del lado derecho'); $val = 4; $places = 4; $res = $val >> $places; p($res, $val, '>>', $places, 'mismo resultado que arriba; no se puede desplazar más allá del 0'); echo "\n--- DESPLAZAMIENTO DE BITS A LA DERECHA SOBRE ENTEROS NEGATIVOS ---\n"; $val = -4; $places = 1; $res = $val >> $places; p($res, $val, '>>', $places, 'copia del bit de signo desplazado al lado izquierdo'); $val = -4; $places = 2; $res = $val >> $places; p($res, $val, '>>', $places, 'bits desplazados fuera del lado derecho'); $val = -4; $places = 3; $res = $val >> $places; p($res, $val, '>>', $places, 'mismo resultado que arriba; no se puede desplazar más allá del -1'); echo "\n--- DESPLAZAMIENTO DE BITS A LA IZQUIERDA SOBRE ENTEROS POSITIVOS ---\n"; $val = 4; $places = 1; $res = $val << $places; p($res, $val, '<<', $places, 'ceros rellenan en el lado derecho'); $val = 4; $places = (PHP_INT_SIZE * 8) - 4; $res = $val << $places; p($res, $val, '<<', $places); $val = 4; $places = (PHP_INT_SIZE * 8) - 3; $res = $val << $places; p($res, $val, '<<', $places, 'bit de signo resulta desplazado fuera'); $val = 4; $places = (PHP_INT_SIZE * 8) - 2; $res = $val << $places; p($res, $val, '<<', $places, 'bit de signo desplazado fuera del lado izquierdo'); echo "\n--- DESPLAZAMIENTO DE BITS A LA IZQUIERDA SOBRE ENTEROS NEGATIVOS ---\n"; $val = -4; $places = 1; $res = $val << $places; p($res, $val, '<<', $places, 'ceros rellenan en el lado derecho'); $val = -4; $places = (PHP_INT_SIZE * 8) - 3; $res = $val << $places; p($res, $val, '<<', $places); $val = -4; $places = (PHP_INT_SIZE * 8) - 2; $res = $val << $places; p($res, $val, '<<', $places, 'bits desplazados fuera del lado izquierdo, incluyendo el bit de signo'); function p($res, $val, $op, $places, $note = '') { $format = '%0' . (PHP_INT_SIZE * 8) . "b\n"; printf("Expression: %d = %d %s %d\n", $res, $val, $op, $places); echo " Decimal:\n"; printf(" val=%d\n", $val); printf(" res=%d\n", $res); echo " Binary:\n"; printf(' val=' . $format, $val); printf(' res=' . $format, $res); if ($note) { echo " NOTE: $note\n"; } echo "\n"; } ?>
Si te hemos ayudado : )
Te agradeceríamos que apoyaras este proyecto
No se te olvide Comentar y Compartir
en:
en:
0 comentarios:
Publicar un comentario