Un bit (Binary digIT) es la unidad básica de información almacenada en un sistema informático que existe en dos posibles estados, representados como ON y OFF. El 1 representa ON y el 0 representa OFF. Estos valores, 0 y 1, se llaman digitos binarios y están especificados en un sistema numérico específico, el sistema binario, cuya base es 2.
Indice de contenido
1. ¿Qué es un byte? | 4. Operador XOR |
2. Operador AND | 5. Operador NOT |
3. Operador OR | 6. Operadores de desplazamiento |
1. ¿Qué es un byte?
Un byte es una secuencia de bits. Un byte son 8 bits. El máximo valor que puede tomar es 255, cuando todos los bits están activos => 11111111:
8º | 7º | 6º | 5º | 4º | 3º | 2º | 1º | ||
Valor de posición | 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 | |
Cálculo | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | Total = 255 |
Podemos representar un valor cualquiera, por ejemplo, el 54:
Valor de posición | 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 | |
Cálculo | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | |
Número a representar | 0 | 0 | 1 | 1 | 0 | 1 | 1 | 0 | Total = 54 |
Esto es: 25 + 24 + 22 + 21 = 32 + 16 + 4 + 2 = 54.
Los operadores bit a bit actúan sobre integers.
2. Operador bit a bit AND
<?php
$x = 10;
$y = 34;
echo $x & $y; // El valor es: 2
El operador AND toma el valor de los bits que $x e $y tienen en común:
Valor de posición | 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 | |
Valor de $x | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 0 | Total = 10 |
Valor de $y | 0 | 0 | 1 | 0 | 0 | 0 | 1 | 0 | Total = 34 |
El único bit que comparten estas variables está en segunda posición, y su valor es 2.
Pongamos un ejemplo en el que comparten más de 1 bit:
<?php
$x = 95;
$y = 203;
echo $x & $y; // El valor será: 75
Valor de posición | 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 | |
Valor de $x | 0 | 1 | Total = 95 | ||||||
Valor de $y | 1 | 1 | Total = 203 |
En este caso coinciden 4 bits. El valor que tomará será la suma de los bits que comparten, esto es 64 + 8 + 2 + 1 = 75.
3. Operador bit a bit OR
<?php
$x = 7;
$y = 14;
echo $x | $y; // El valor será: 15
Valor de posición | 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 | |
Valor de $x | 0 | 0 | 0 | 0 | 0 | 1 | 1 | Total = 7 | |
Valor de $y | 0 | 0 | 0 | 0 | 1 | 1 | 0 | Total = 14 |
El valor que tomará esta vez será la sumar de los bits de cualquiera de los dos, coincidan o no, esto es 8 + 4 + 2 + 1 = 15.
4. Operador bit a bit XOR
El operador Xor realiza una comparación bit a bit entre dos expresiones numéricas y establece el correspondiente bit en el resultado. Cuando sólo una expresión es true el resultado es true.
Bit en $x | Bit en $y | Resultado | Valor |
0 | 0 | 0 | False |
0 | 1 | 1 | True |
1 | 0 | 1 | True |
1 | 1 | 0 | False |
Ejemplo:
<?php
$x = 14;
$y = 8;
echo $x ^ $y; // El valor será: 10
Valor de posición | 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 | |
Valor de $x | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 0 | Total = 14 |
Valor de $y | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | Total = 8 |
En este caso se excluye el único bit que coincide, y el valor será la suma de los demás bits que están en $x o $y, esto es: 8 + 2 = 10.
5. Operador bit a bit NOT
El operador NOT (~) devuelve true cuando el bit de una expresión no está establecido en otra expresión.
Ejemplo de NOT usando AND después:
<?php
$x = 14;
$y = 11;
echo $x & ~ $y; // El valor será: 4
Valor de posición | 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 | |
Valor de $x | 0 | 0 | 0 | 0 | 1 | 0 | Total = 14 | ||
Valor de $y | 0 | 0 | 0 | 0 | 1 | 1 | Total = 11 |
En este caso la expresión devolverá el los bits que estén en $x pero no en $y, esto es 4.
Ejemplo de NOT usando AND antes:
Utilizando este mismo ejemplo anterior, pero cambiando el lugar del NOT:
<?php
$x = 14;
$y = 11;
echo ~ $x & $y; // El valor será : 1
El valor será sólo 1, ya que es el único bit que aparece en $y pero no en $x.
6. Operadores bit a bit de desplazamiento
Si a y b son dos números, el desplazamiento de bits (bit shifting) desplaza a bits un número b de posiciones. Cada posición es multiplicar por dos si es desplazamiento a la izquierda (bit shift left). Si es desplazamiento a la derecha es (bit shift right), cada posición se refiere a dividir por dos.
Desplazamientos a la izquierda
<?php
$x = 4;
$y = 2;
echo $x << $y; // El valor será: 16
Valor de posición | 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 | |
Valor de $x | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | Total = 4 |
Resultado | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | Total = 16 |
En este ejemplo, un valor de $x de 8 se tiene que mover un número $y de posiciones, en este caso dos, lo que resulta en multiplicar 2 veces por 2, resultando 16.
Desplazamientos a la izquierda avanzados
<?php
$x = 24;
$y = 2;
echo $x << $y; // El valor será: 96
Valor de posición | 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 | |
Valor de $x | 0 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | Total = 24 |
Resultado | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | Total = 96 |
En este caso el valor de $x es 24, que será multiplicado por 2 un número $y de veces, en este caso dos, resultará un valor de 96: 24 x 2 x 2 = 96.
Desplazamientos a la derecha
<?php
$x = 16;
$y = 2;
echo $x >> $y; // El valor será: 4
Valor de posición | 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 | |
Valor de $x | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | Total = 16 |
Resultado | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | Total = 4 |
El valor de $x es 16, desplazamos a la derecha un número $y de veces, dividiendo dos veces para 2, resultando así un valor de 4.
Desplazamientos a la derecha avanzados
<?php
$x = 48;
$y = 2;
echo $x >> $y; // El valor será 12
Valor de posición | 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 | |
Valor de $x | 0 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | Total = 48 |
Resultado | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 0 | Total = 12 |
El valor de $x es 48, desplazamos a la derecha un número $y de veces, dividiendo dos veces para 2, resultando así un valor de 12.
*Cuando se hacen desplazamientos a la derecha un número $y de veces que excede del límite del primer bit, el resultado será 0.