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.