Colabora
 

Conversión de un Número a otra Base

[por elMesero]

 

Fecha: 24/Nov/2008 (24-11-08
Autor: Ricardo Bernave Llamocca Choquehuanca - [email protected]

 


Introducción:

Navegando y chateando como de costumbre, sostuve una conversación entre un amigo (H) sobre el tratamiento de la información en memoria, bueno en mi poco conocimiento solo alcance a decirle que se trabaja con sistema Hexadecimal (base 16), y me pregunto cómo se haría para reconocer a ciencia cierta que representa ese número hexadecimal, lógicamente se puede hacer con un Debug en la ventana de comandos del Windows, pero no quise hacerme problemas. De esta manera me plantee la idea de cómo sería convertir un numero a otra base, lógicamente pensé en recursividad, ya que es lo mas practico creo yo, además máximo un numero debería llegar a 32 o 64 bits, según sea la arquitectura del computador (aclaro que yo no trabajo o me meto con la arquitectura, solo en diseñar el algoritmo), y si es así, entonces el consumo de memoria es despreciable. Así que me puse a pensar en esos algoritmos, ya que un algoritmo debe ser programable en cualquier lenguaje, obviamente lo realice en .Net, ya que es uno de mis lenguajes más usado. En esta colaboración solo entrare en detalles de las funciones mas no del código del formulario, y de igual manera dejo el código completo en el link de descarga.

 

Del Formulario :

Bueno, así está diseñado el formulario, pasó a explicar brevemente como trabaja cada botón para su uso respectivo si es que se descarga el código completo.

Botones :

Numero_Binario:
Convierte el número ingresado en la celda a su representación respectiva en binario.

Numero_Base:
Convierte el número ingresado en la celda a su representación respectiva en la base seleccionada del combobox.

Caracteres_Binario:
Convierte los caracteres ingresados en la celda a su representación carácter por carácter en binario, a su ves también muestra su representación en ASCII.

Caracteres_Base:
Convierte los caracteres ingresados en la celda a su representación carácter por carácter en la base seleccionada del combobox, a su ves también muestra su representación en ASCII.

LimpiarListBox :
Limpia el listbox.

El código:

Bueno cada función esta casi explicada en código, igualmente daré unos referencias cortas.

Con esta función, solo sacaremos el valor binario de un numero entero.

Function SoloBinario(ByVal Numero As Integer) As String

        'Variable de almacenamiento temporal

        Dim Temporal As Integer

        Dim Cociente As Integer

        'Weno creo qua ya saben pa que sirve

        Temporal = Numero

         If Numero <> 0 Then

            'Trabajamos mientras el numero sea diferente de cero

            If (Numero Mod 2) = 1 Then

                'Si el numero es impar entonces

                'Lo Volvemos par

                Numero = Numero - 1

            End If

            'Dividimos el numero par para realizar la siguiente transformacion

            Cociente = Numero / 2

            'Aqui aplicamos la recursividad

            'Donde agregaremos de izquierda a derecha

            'Como es la nomenclatura de los numeros binarios

            'Segun formato "Little Endian"

            SoloBinario = SoloBinario(Cociente) + (Temporal Mod 2).ToString

        Else

            'Caso contrario termino la recursividad

            'Entonces cerramos la cadena con un cero

            If Numero = 0 Then

                SoloBinario = "0"

            Else

                SoloBinario = ""

            End If

        End If

 

        Return SoloBinario

    End Function

Con esta función solo mejoramos la vista del numero binario, rellenándolo de 0 para que ocupe los 8bits.

Function SoloBinario8(ByVal Numero As Integer) As String

        'Esta funcion es complemento de la otra

        'La diseñe con respecto a que solo se mostraran 8 bits

        SoloBinario8 = SoloBinario(Numero)

        'Solo funciona si el numero entregado por la funcion SoloBinario

        'Es de menos de 8 digitos

        If SoloBinario8.Length < 8 Then

            Dim Index As Integer

            Dim i As Integer

            'Econtramos la cuantos digitos rellenaremos

            Index = 8 - SoloBinario8.Length

            For i = 1 To Index

                'Rellenamos el numero de ceros de derecha a izquierda

                SoloBinario8 = "0" + SoloBinario8

            Next i

        End If 

        Return SoloBinario8

    End Function

Esta función es una generalización de la función SoloBinario, para el calculo de números en distintas bases.

Function NumeroBase(ByVal Numero As Integer, ByVal Base As Integer) As String

        'Este algoritmo tiene la misma estructura que SoloBinario

        'Simplemente que se generalizo para que pueda

        'Transformarce un numero a cualquiera base

        'Solo explicare partes puntuales 

        Dim Temporal As Integer

        Dim Cociente As Integer

        Dim Modulo As Integer

        Dim ModuloTexto As String = "" 

        Temporal = Numero

        'Solo por sintaxis, un numero "10 = a" en otra base, nada mas

        'Por eso esta porsion de codigo

        Modulo = (Temporal Mod Base)

        Select Case Modulo

            Case 10

                ModuloTexto = "A"

            Case 11

                ModuloTexto = "B"

            Case 12

                ModuloTexto = "C"

            Case 13

                ModuloTexto = "D"

            Case 14

                ModuloTexto = "E"

            Case 15

                ModuloTexto = "F"

            Case 16

                ModuloTexto = "G"

            Case Else

                'Para los casos menores a 10

                ModuloTexto = Modulo.ToString

        End Select

        'RichieRichieRichieRichieRichieRichieRichieRichieRichieRichie

        'La Base no puede ser negativa ni menor a 2

        If Base <= 1 Then

            Base = 2

        End If

        If Numero <> 0 Then

            If (Numero Mod Base) <= (Base - 1) Then

               'Si el numero no es divisible por la base

               'Con esta restriccion tendremos un numero

                'Divisible exactamente por la base

                Numero = Numero - (Numero Mod Base)

            End If

            Cociente = Numero / Base

            NumeroBase = NumeroBase(Cociente, Base) + ModuloTexto

        Else

            If Numero = 0 Then

                NumeroBase = "0"

            Else

                NumeroBase = ""

            End If

        End If

        Return NumeroBase

    End Function

Y así terminaríamos con estas pequeñas conversiones.


Sobre el Autor:

Nombre: Ricardo Bernave LLamocca Choquehuanca

Alias: elMesero

e-Mail: [email protected]

Profesión: Aun de vago en la Universidad

 

 



Compromiso del autor del artículo con el sitio del Guille:

Lo comentado en este artículo está probado (y funciona) con la siguiente configuración:

El autor se compromete personalmente de que lo expuesto en este artículo es cierto y lo ha comprobado usando la configuración indicada anteriormente.

En cualquier caso, el Guille no se responsabiliza del contenido de este artículo.

Si encuentras alguna errata o fallo en algún link (enlace), por favor comunícalo usando este link:

Gracias.


Código de ejemplo (comprimido):

 

Fichero con el código de ejemplo: elMesero_NumeroAOtraBase.zip - 32.50 KB

(MD5 checksum: 435D30927DEFA31BB348B4E05CDC82D8)

 


Ir al índice principal de el Guille