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