Traductor




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:
                          

0 comentarios:

Publicar un comentario