Ir al contenido principal

Trabajando con binarios...

Vamos a ver como trabajar con números binarios, para esto vamos a explicar q son los números binarios y las operaciones básicas q podemos realizar con ellos...

El sistema binario, es un sistema de numeración posicional, donde los números son representados solo con ceros y unos. Este sistema es de suma importancia para la informática ya q es el único idioma q entiende la maquina, toda información en un sistema informático digital se representa con binarios.
El sistema de numeración q normalmente usamos es decimal ([numero])10, quiere decir q contamos con 10 elementos para representar los distintos valores, esto es 0,1,...,9. Como también es un sistema posicional el valor de la base equivale a la combinación de 0 y 1, lo q conocemos como diez 10.
El sistema binario por su parte usa solo 0 y 1 para operar, es un sistema de base 2 o sea ([numero])2 como en el sistema decimal el valor de la base coincide con la combinación de 0 y un 1 (10)2 representa el 2.

Bien vamos a explicar algunas operaciones para q vean mas fácil todo esto...

-Transformar un número decimal entero a binario:
Para lograr esto vamos a hacer divisiones sucesivas en 2 hasta conseguir q la división sea igual a 1 y luego armamos el binario con este 1 y los numeros de los restos desde abajo hacia arriba de esta manera
                                                                                                            ** fuente de la imagen wikipedia.
Como vemos en este ejemplo, se divide 100 en 2, esto es igual a 50 y nos queda de resto 0, volvemos a dividir lo q nos quedó, 50 divido en 2 es 25 y de resto nos queda 1, seguimos haciendo estos pasos hasta llegar, en este caso, a dividir 3 en 2 cuyo resultado es 1 y el resto 1. Una vez q llegamos hasta este punto, tomamos el último resultado, siempre va a ser 1 y junto a el comenzamos a agregar los restos de las distintas divisiones, uno por uno, desde abajo hacia arriba. Luego la notación es la q observamos en la parte superior.

-Transformar un número entero con decimales:
Para convertir estos números vamos a hacer exactamente el mismo trabajo q recién para la parte entera, y para la parte decimal hacemos lo siguiente...
Tomamos la parte decimal q separamos de la parte entera, por ejemplo si el número es 100,45 trabajamos transformando el 22 como se explico en el punto anterior y luego tomamos 0,45 para trabajarlo ahora.
Vamos a multiplicar este decimal por 2 y si el resultado es mayor q 1 colocamos un 1 al lado del binario q obtuvimos anteriormente detrás de una coma, sino colocamos un 0, seria algo así.
0,45 * 2 = 0,90 ---> como es menor q 1 agregamos un 0 al binario
         1100100,0    (número binario q calculamos anteriormente agregando la parte decimal)
y seguimos haciendo lo mismo
0,90 * 2 = 1,80 ---> como es mayor q 1 colocamos un 1
        1100100,01
tomamos nuevamente la parte decimal y volvemos a operar
0,80 * 2 = 1,60
        1100100,011
0,60 * 2 = 1,20
        1100100,0111
0,20 * 2 = 0,40
        1100100,01110
Finalizamos cuando encontremos una cantidad de cifras decimales q nos parezcan razonables, cuando veamos q se comienzan a repetir de forma periódica.

-Transformación de binario a decimal:
Ahora vamos a volver a nuestro número decimal, para esto vamos a hacer la sumatoria de multiplicar [binario]*2 elevado a la potencia q representa a la posición, no te asustes es más fácil de lo q suena...
De forma general seria asi, esto te va a servir para convertir un numero en cualquier base a decimal.
               sumatoria de [binario]*[base]elevado[posición]
Siguiendo con el ejemplo q teníamos.
(1100100)2=0*20+0*21+1*22+...

otra imagen de wikipedia para q lo entiendan


-Convertir binario con decimal a entero
En este caso comenzamos por el lado izquierdo de la parte decimal, o sea la primer cifra desde la coma, vamos a hacer la suma sucesiva de multiplicar la cifra binaria por la base elevada a la posición por -1, pero comenzando desde 1, seria así

0,01110 = 0 * 2-11 * 2-21 * 2-31 * 2 -4 1 * 2-4
0,01110 =         0   +   o,25  +  0,125  + 0,0625 +  0
0,01110 = 0,4375


-Suma de números binarios
Se realiza como con los decimales
    101
+  011
=1000


para hacer esto usamos
1+1=10
0+1=1
1+0=1
0+0=0


-Resta de binarios
Es igual q con demimales
   1000
-  0011
= 0101


para hacer esto usamos
0-1=1 (para esto pedimos una unidad al binario de la izquierda como en los decimales, cuando obtenemos un 1 de la izquierda este es vale 10, por lo q restandole 1 queda 1)
1-1=0
1-0=1


Si se les complica restar de esta manera existe el método de restar usando el complemento a 2.
Este método transforma la resta en una suma. Para hacer esto usamos el complemento a 2 del sustraendo y quedaría así.

La siguiente resta, 91 - 46 = 45, en binario es:
1011011                                             1011011
-0101110 el C2 de 0101110 es 1010010 +1010010
———————— ————————
0101101 10101101

                                                                                                                                            **ejemplo de wikipedia.


El complemento a 2 se obtiene manteniendo el primer 1 desde la derecha del binario, y luego intercambiando 0 por 1 y 1 por 0, con el resto de las cifras binarias.
En el ejemplo se queria transformar 0101110
Para eso venimos analizando cifra a cifra desde la derecha   0101110  <----- y mantenemos las cifras tal cual como estan hasta encontrar el primer 1
En este caso 01011|1|0 <----
Despúes intercambiamos 0 por 1 en las otras cifras para obtener nuesto C2
0101110 <---- 1010010

y ahora solo nos queda sumar como cualquier par de binarios, en el caso de q al realizar la suma nos sobrara una cifra por la izquierda esta se desprecia (sólo sucede esto al aplicar el método del complemento a 2)


-Multiplicación y división de binarios es similar a la de decimales

  10110       
1001
—————————
10110
00000
00000
10110
—————————
11000110


Con números mayores, se utiliza un método llamado algoritmo de Booth:
                 11101111
111011
__________
11101111
11101111
00000000
11101111
11101111
11101111
______________
11011100010101

Para la división hacemos lo mismo q con decimales:

 100010010 |1101
——————
-0000 010101
———————
10001
-1101
———————
01000
- 0000
———————
10000
- 1101
———————
00111
- 0000
———————
01110
- 1101
———————
00001

                               *** todos son ejemplos obtenidos de wikipedia si quieren saber mas consulten sistema binario.
-Bueno ahora vamos a hablar de la conversión de binario a hexadecimal y a octal.
Para pasar un número binario a octal hacemos lo siguiente:
1) Agrupamos las cifras del binario de a tres comenzando desde la derecha.
ejemplo:
             (110111)2 <----  110|111

2) Trabajamos con cada grupo formado por separado pero manteniendo el orden
            110
            111
3) Calculamos el valor correspondiente para cada grupo de la manera q ya vimos
          valor = [cifra binario] * [base][posición]
          (110)2 = 0 * 201 * 211 * 22 = 0 + 2 + 4 = 6
          (111)2 = 1 * 201 * 211 * 22 = 1 + 2 + 4 = 7
Ojo! En el caso de q al agrupar las cifras no lleguemos a 3 completamos el grupo con 0
        Si al agrupar nos quedan una o dos cifras nada mas completamos con ceros a la izquierda
        11 --> 011
        10 --> 010
        1   --> 001   
4) Solo nos queda volver a armar nuestro número uniendo las partes, el ejemplo quedaria
        110|111 = 6|7
       (110111)2 = 67
Para pasar un binario a hexadecimal hacemos lo mismo solo q en lugar de tomar grupos de 3 cifras tomamos grupos de 4 cifras, además tenemos q tener en cuenta la tabla de valores de los números exadecimades:
                    valor -->   0   1   2   3   4   5  6   7   8   9   10   11   12   13   14   15
       hexadecimal -->    0   1   2   3   4   5  6   7   8   9    A    B     C    D     E     F
Entonces si al calcular el valor de nuestro grupo de 4 cifras el resultado es 15, en lugar de colocar 15 ponemos F
      110|1111|0101     Separamos en grupos de 4 cifras completamos con 0 de ser necesario
      (0110)2 = 0 * 201 * 211 * 22 + 0 * 23 = 0 + 2 + 4 + 0 = 6
      (1111)21 * 201 * 211 * 22 + 1 * 23 = 1 + 2 + 4 + 8 = 15 --> F
      (0101)21 * 200 * 211 * 22 + 0 * 23 = 1 + 0 + 4 + 0 = 5
Armamos nuestro número --> (11011110101)2 = 6F5

Comentarios

Entradas populares de este blog

C: Conversiones de tipo (casting) en C...

El casting o simplemente cast  nos permite hacer una conversión explícita de un tipo de dato a otro, a criterio del programador siempre y cuando estos tipos sean compatibles. Este cast se realiza a través de un operador de conversión de tipos (type casting operator) y es un recurso a tener en cuenta ya que hay situaciones en que nos puede resultar de gran utilidad. Hacer uso de un cast es tan sencillo como poner (tipo de dato)  delante de la expresión o variable a convertir. Veamos un ejemplo: Declaramos una variable de tipo int con un identificador tan creativo como "a" y le realizamos diferentes cast a a para mostrarlo como si fuera un float, un double y un char en un printf. Lo que obtendríamos en pantalla sería lo siguiente: Donde tenemos el valor de nuestro a, a convertido en float y double (mostrándolo con 3 cifras decimales) y a convertido en char. Si vemos este último caso, al hacer la conversión de "a" a char toma a como el código ascii de

C: Ejemplos: Congruencia de Zeller (nivel básico) ...

La Congruencia de Zeller es un algoritmo que se atribuye al matemático alemán Julius Christian Johannes Zeller que vivió en el siglo XIX. Este algoritmo nos permite determinar el día de la semana que le corresponde a una fecha determinada del calendario Gregoriano. La fórmula que nosotros usaremos (con algunas modificaciones respecto de la original para poder usarla en  informática) es la siguiente: Donde h es el día de la semana (entre 0 y 6), J es año/100 (la centuria) y K es año mod 100 (el año de la centuria). Y hay que tener en cuenta que los meses de enero y febrero cuentan como el mes 13 y 14 del año anterior. Ahora que tenemos la fórmula, programemos el algoritmo en C mediante el uso de una función: Analicemos el código paso a paso: Tenemos en cuenta el caso de enero y febrero: Dijimos que estos meses corresponden a los meses 13 y 14 del año anterior por lo que los asignamos como corresponde (mes + 12 , que dará 13 para enero y 14 para febrero) y le rest

Algoritmos: Resolución de problemas y refinamientos en pseudocódigo...

En otras entradas, vimos las partes que debe tener nuestro algoritmo en pseudocódigo y las estructuras que utilizaremos para resolverlo. Ahora llega el turno de implementar todo en conjunto para dar origen a nuestra creación. Pero ¿cómo resolvemos un problema así? Para hacerlo, utilizaremos lo que llamamos refinamientos sucesivos. Este concepto consiste en dividir el problema en subproblemas más pequeños y a estos, a su vez, en otros más pequeños; y así sucesivamente hasta que la solución de los últimos sea trivial, sencillo de resolver. Luego usaremos todas las soluciones obtenidas para armar la solución de nuestro problema mayor. Este principio, tiene base en parte de la técnica divide and conquer (dependiendo de la traducción: "divide y vencerás") que es una de las muchas técnicas de resolución de algoritmos existentes. Como vemos, al dividir el problema en otros más pequeños y más fáciles de resolver, podemos pasar de un problema complicado a uno cuya solución es much