Colabora |
Conversión de un Número a otra Base[por elMesero]
Fecha: 24/Nov/2008 (24-11-08
|
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: Numero_Base: Caracteres_Binario: Caracteres_Base: LimpiarListBox : 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:
|
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
|