Learning machine #15 - Operaciones a nivel del bits.

Hola de nuevo a todos, el día de hoy vamos a ver cómo es que se realizan las operaciones a nivel de bit usando cómo referencia a los operadores de C#. Hay que tener en cuenta que dependiendo de la plataforma y del lenguaje que se use, las operaciones pueden variar un poco, pero el concepto sigue siendo el mismo.



Para empezar, hay que tomar en cuenta que este tipo de operador solo se aplica a los números enteros "int", por lo que podemos decir que aplicar cierta operación puede producir un resultado no esperado si no tomamos en consideración lo anterior.

Operadores de desplazamiento (<< y >>)

El operador "<<" o "operador de desplazamiento a la izquierda" (Left shift para los cuates). Sirve para desplazar los bits a la izquierda, es decir mueve el valor de un bit. Para poder observar un poco mejor a lo que me refiero, tomemos el número 101 en base dos, si desplazamos un bit a la izquierda, tendremos el número 1010. Hay que tener en cuenta lo que mencione al inicio, las operaciones se hacen en número enteros, si el número está definido cómo "int" tendríamos en memoria algo cómo la imagen que sigue:


Si lo desplazamos un lugar a la izquierda tendremos:


En c# podemos indicar cuantos "lugares" queremos desplazar nuestro número. Si por ejemplo desplazamos nuestro número ocho lugares, tendremos:


Nuestro número original era 5, cuando lo desplazamos un lugar obtuvimos 10 y cuando lo desplazamos 8 obtuvimos 1280.

¿Pero que pasa si lo desplazamos 29 lugares? Simple, obtenemos lo siguiente:


Y no parece nada del otro mundo, pero que pasa si le pedimos a c# que nos diga cual es el valor de este número, nos dirá que es ‭-1610612736‬ que está bien pero si no esperamos un número negativo podría sorprendernos un poco (hace un tiempo en un post, mas o menos expliqué por que pasa, sientete libre de revisarlo).

Si desplazamos el número 30 lugares tendremos:



El desplazamiento es realmente intuitivo, solo hay que tener las consideraciones necesarias.

El operador ">>" o "operador de desplazamiento hacia la derecha" (right shift) sirve para desplazar los bits a la derecha. Al igual que el operador "<<" se aplica a los números enteros y sirve para "mover" los números. Tomemos cómo ejemplo el mismo número; es decir 5 o 101 en base dos; tendremos:


Si desplazamos un lugar a la derecha tendremos:

Es muy fácil ver que en efecto se "movió" a la derecha y ahora en lugar de ser el número cinco, es el número dos. Si al número cinco lo desplazamos tres lugares a la derecha, tendremos;

Por lo que la variable si es que le asignamos el mismo valor pero con el desplazamiento habremos perdido nuestro valor y si aplicamos el desplazamiento contrario no lo podemos recuperar. Por eso lo que yo hago es siempre asignar una variable auxiliar para solo modificar el valor en ella y dejar intacta la variable original.

Operador Not (~).

Dependiendo del lenguaje que se use varia un poco cómo se especifica este operador. En C# el operador "not" se escribe usando "~". Su función es la de invertir los bits de un número. Para demostrar con mayor claridad tomemos de nueva cuenta al número cinco;



Si usamos el operador "~" obtenemos:

Ahora tenemos que si le aplicamos el operador "~" al número 5 nos resulta el valor de -6 (recordatorio amable, el tipo "int" usa un bit para indicar el signo).

Operador AND (&).

El operador "and" aplica la operación and a dos números. Hay que recordar  que "and" solo produce un uno cuando ambas valores son uno, en cualquier otro caso devuelve cero. Cómo ejemplo tomemos el número diez decimal o 1010 en binario y el número dos o 10 en binario.



Cómo podrás observar, al aplicar la operación al número diez junto con el número dos obtenemos el número dos.

Operador Or (|).

El operador " Or" aplica la operación or a dos números. Tomemos cómo ejemplo los números cinco decimal o 101 en binario y el número diez decimal o 1010 en binario, tendremos lo siguiente.

Recordemos que la operación or devuelve un uno cuando cualquiera de los dos valores es uno, por lo que al aplicar la operación or al número cinco y diez en decimal, nos resulta quince.

Y bien, por ahora es todo, en el siguiente post veremos unos ejemplos en c# donde haremos uso de los operadores para agilizar nuestro trabajo. Recuerda que en este mes cumplimos años por lo que espero publicar unos cuantos post mas para "celebrar".

Los leo luego.

No hay comentarios.