Comunidad de diseño web y desarrollo en internet

Convertir base decimal a hexadecimal, octal o binaria en AS2

El Sistema Decimal (Dec)


El sistema decimal es el sistema de numeración que utilizamos normalmente para contar. El nombre "decimal" viene de la utilización de 10 números (decimos que tiene base 10), que no son otros que los números del 0 al 9. Para seguir contando, añadimos nuevos números a la siguiente cifra (08, 09, 10, 11...). Realmente, en decimal, cada cifra (teniendo como primera cifra a la cifra de la derecha, y empezando a contar desde "cifra 0"), tendría un peso de 10 (base del sistema decimal) elevado al número de cifra. Lo veremos mejor gráficamente:
Número: 275

Cifra 0: 5 --> Valor de 5*(10^0)
Cifra 1: 7 --> Valor de 7*(10^1)
Cifra 2: 2 --> Valor de 2*(10^2)

Valor: 2*(10^2) + 7*(10^1) + 5*(10^0) =
= 2*100 + 7*10 + 5*1 = 200 + 70 + 5 = 275


Los Sistemas Hexadecimal (Hex), Octal (Oct) y Binario (Bin)


No obstante, existen otros sistemas de numeración; a saber, el hexadecimal (base 16), el octal (base 8 ) y el binario (base 2). El primero, utiliza los números del 0 al 15, pero los números de 2 cifras se representan con las letras A-F [8, 9, A (10), B (11), ..., F (15)]. El segundo, los números del 0 al 7. Finalmente, el binario (quizá el sistema de numeración más "conocido") utiliza los números 0 y 1. Para conocer el valor de un número en base hexadecimal, octal o binaria, utilizamos el mismo sistema de antes: cada cifra tiene un valor de base ^ cifra. Unos ejemplos:
Base: Hexadecimal (16)
Número: 2A
Valor: 2*(16^1) + A*(16^0) = 2*16 + A*1 = 32+A --> (A=10) --> 42

Base: Octal (8)
Número: 171
Valor: 1*(8^2) + 7*(8^1) + 1*(8^0) = 1*64 + 7*8 + 1*1 = 64 + 56 + 1 = 121

Base: Binaria (2)
Número: 101
Valor: 1*(2^2) + 0*(2^1) + 1*(2^0) = 1*4 + 0*2 + 1*1 = 4 + 1 = 5

Ahora sabemos que los dálmatas no eran 101, sino 5, pero hablaban en binario y nadie lo sabía. No obstante, ese será nuestro secreto :evil:

Código en ActionScript


Ahora que ya sabemos como convertir una base decimal en una base Hex, Oct o Bin de forma manual, vamos al código que lo haría automáticamente:

Código de un conversor hexadecimal


Código :

//Declaración de la función toHex, la cual será la encargada de convertir el número Decimal a Hexadecimal
function toHex(num:Number){
   //Comprobar si es un número (y no una variable con algún otro tipo de valor)
   if(isNaN(num)){
      return "Número no válido"
   }else{
      //Calcular número de cifras de "num"
      var cifras:Number = 1
      for(intentos = 0;intentos != cifras;intentos ++){
         //Se comprueba si el número es mayor que las potencias de 16 en orden (desde 16 elevado a 0)
         //Para así saber si hay que añadir más cifras o no
         if(num/Math.pow(16,intentos) >= 16){
            cifras ++
         }
      }
      //Calcular cifras que tendrá el número Hexadecimal
      //(cada cifra se guardará en una posición del array "pesos_num")
      var pesos_num:Array = new Array()
      num_temp = num
      for(peso = cifras;peso >= 1;peso --){
         //Añadir cifra a "pesos_num"
         pesos_num.push(Math.floor(num_temp/Math.pow(16,peso-1)))
         //Esto es el código inverso de lo que hacíamos para calcular las cifras del número
         num_temp -= Math.floor(num_temp/Math.pow(16,peso-1))*Math.pow(16,peso-1)
      }
      //Añadir las cifras a una variable del tipo String llamada "num_final", calculando a su vez
      //las cifras con valor mayor que 9 (las cuales representamos con las letras A-F)
      var num_final:String = new String("")
      for(cifrActual = 0;cifrActual < pesos_num.length;cifrActual ++){
         if(pesos_num[cifrActual] == 15){
            num_final += "F"
         }else if(pesos_num[cifrActual] == 14){
            num_final += "E"
         }else if(pesos_num[cifrActual] == 13){
            num_final += "D"
         }else if(pesos_num[cifrActual] == 12){
            num_final += "C"
         }else if(pesos_num[cifrActual] == 11){
            num_final += "B"
         }else if(pesos_num[cifrActual] == 10){
            num_final += "A"
         }else{
            num_final += pesos_num[cifrActual]
         }
      }
      //Devolver número final
      return num_final
   }
}


Código de conversores octal y binario


De este código podemos obtener los de Octal y Binario (cambiando 16 por 8 y 2 respectivamente, y quitando la parte de las letras A-F, ya que en Binario y Octal nunca habrá números mayores que 9). Los códigos quedarían así (estos códigos ya no los explico, ya que son derivados del otro):

Código :

//DECIMAL a OCTAL
function toOct(num:Number){
   if(isNaN(num)){
      return "Número no válido"
   }else{
      Calcular número de cifras de "num"
      var cifras:Number = 1
      for(intentos = 0;intentos != cifras;intentos ++){
         if(num/Math.pow(8,intentos) >= 8){
            cifras ++
         }
      }
      Calcular cifras en Hexadecimal
      var pesos_num:Array = new Array()
      num_temp = num
      for(peso = cifras;peso >= 1;peso --){
         pesos_num.push(Math.floor(num_temp/Math.pow(8,peso-1)))
         num_temp -= Math.floor(num_temp/Math.pow(8,peso-1))*Math.pow(8,peso-1)
      }
      Calcular cifras con letras
      var num_final:String = new String("")
      for(cifrActual = 0;cifrActual < pesos_num.length;cifrActual ++){
         num_final += pesos_num[cifrActual]
      }
      return num_final
   }
}

Código :

//DECIMAL a BINARIO
function toBin(num:Number){
   if(isNaN(num)){
      return "Número no válido"
   }else{
      var cifras:Number = 1
      for(intentos = 0;intentos != cifras;intentos ++){
         if(num/Math.pow(2,intentos) >= 2){
            cifras ++
         }
      }
      var pesos_num:Array = new Array()
      num_temp = num
      for(peso = cifras;peso >= 1;peso --){
         pesos_num.push(Math.floor(num_temp/Math.pow(2,peso-1)))
         num_temp -= Math.floor(num_temp/Math.pow(2,peso-1))*Math.pow(2,peso-1)
      }
      var num_final:String = new String("")
      for(cifrActual = 0;cifrActual < pesos_num.length;cifrActual ++){
         num_final += pesos_num[cifrActual]
      }
      return num_final
   }
}


La llamada a las funciones es simple, pero a continuación les dejaré un ejemplo con las funciones ya integradas.

Código final de conversión entre bases numéricas


Código :

//Código de las funciones
function toHex(num:Number){
   if(isNaN(num)){
      return "Número no válido"
   }else{
      var cifras:Number = 1
      for(intentos = 0;intentos != cifras;intentos ++){
         if(num/Math.pow(16,intentos) >= 16){
            cifras ++
         }
      }
      var pesos_num:Array = new Array()
      num_temp = num
      for(peso = cifras;peso >= 1;peso --){
         pesos_num.push(Math.floor(num_temp/Math.pow(16,peso-1)))
         num_temp -= Math.floor(num_temp/Math.pow(16,peso-1))*Math.pow(16,peso-1)
      }
      var num_final:String = new String("")
      for(cifrActual = 0;cifrActual < pesos_num.length;cifrActual ++){
         if(pesos_num[cifrActual] == 15){
            num_final += "F"
         }else if(pesos_num[cifrActual] == 14){
            num_final += "E"
         }else if(pesos_num[cifrActual] == 13){
            num_final += "D"
         }else if(pesos_num[cifrActual] == 12){
            num_final += "C"
         }else if(pesos_num[cifrActual] == 11){
            num_final += "B"
         }else if(pesos_num[cifrActual] == 10){
            num_final += "A"
         }else{
            num_final += pesos_num[cifrActual]
         }
      }
      return num_final
   }
}
function toOct(num:Number){
   if(isNaN(num)){
      return "Número no válido"
   }else{
      var cifras:Number = 1
      for(intentos = 0;intentos != cifras;intentos ++){
         if(num/Math.pow(8,intentos) >= 8){
            cifras ++
         }
      }
      var pesos_num:Array = new Array()
      num_temp = num
      for(peso = cifras;peso >= 1;peso --){
         pesos_num.push(Math.floor(num_temp/Math.pow(8,peso-1)))
         num_temp -= Math.floor(num_temp/Math.pow(8,peso-1))*Math.pow(8,peso-1)
      }
      var num_final:String = new String("")
      for(cifrActual = 0;cifrActual < pesos_num.length;cifrActual ++){
         num_final += pesos_num[cifrActual]
      }
      return num_final
   }
}
function toBin(num:Number){
   if(isNaN(num)){
      return "Número no válido"
   }else{
      var cifras:Number = 1
      for(intentos = 0;intentos != cifras;intentos ++){
         if(num/Math.pow(2,intentos) >= 2){
            cifras ++
         }
      }
      var pesos_num:Array = new Array()
      num_temp = num
      for(peso = cifras;peso >= 1;peso --){
         pesos_num.push(Math.floor(num_temp/Math.pow(2,peso-1)))
         num_temp -= Math.floor(num_temp/Math.pow(2,peso-1))*Math.pow(2,peso-1)
      }
      var num_final:String = new String("")
      for(cifrActual = 0;cifrActual < pesos_num.length;cifrActual ++){
         num_final += pesos_num[cifrActual]
      }
      return num_final
   }
}

//Ejemplos de uso
trace(toHex(42)) //Output: 2A
trace(toOct(121)) //Output: 171
trace(toBin(5)) //Output: 101


Espero que les haya gustado este tip, y espero también que alguien haya aprendido algo con lo que he contado, ya que yo no me explico demasiado bien... :wtf:

Publica tu comentario

o puedes...

¿Estás registrado en Cristalab y quieres
publicar tu URL y avatar?

¿No estás registrado aún pero quieres hacerlo antes de publicar tu comentario?

Registrate