Cambiar un número de decimal a binario o hexadecimal y viceversa con bc

Si tenemos que cambiar un valor de sistema de numeración, nos podemos ayudar de bc, indicándole en la entrada el valor de «ibase», la base del número de entrada y «obase», la base del valor que queramos que nos devuelva. Por defecto, bc devuelve los resultados en decimal, por lo que si queremos convertir de cualquier otra base a decimal, no es necesario indicarle el parámetro «obase».

Convertir de decimal a binario

#!/bin/bash

let decimal=3

binario=$(echo "ibase=10;obase=2;$decimal" | bc)

echo $decimal en binario es $binario

Convertir de decimal a hexadecimal

#!/bin/bash

let decimal=255

hexadecimal=$(echo "ibase=10;obase=16;$decimal" | bc)

echo $decimal en hexadecimal es $hexadecimal

Convertir de binario a decimal

#!/bin/bash

let binario=11

decimal=$(echo "ibase=2; $binario" | bc)

echo El número binario $binario en decimal es $decimal

Convertir de hexadecimal a decimal

#!/bin/bash

hexadecimal=FF

decimal=$(echo "ibase=16; $hexadecimal" | bc)

echo El número hexadecimal $hexadecimal en decimal es $decimal

Nótese que para aportar el valor hexadecimal a la variable, no he usado let, ya que FF no lo entendería como un valor numérico.

Convertir de binario a hexadecimal

#!/bin/bash

hexadecimal=FF

binario=$(echo "ibase=16;obase=2;$hexadecimal" | bc)

echo El número hexadecimal $hexadecimal en binario es $binario

Convertir de hexadecimal a binario

Hasta ahora hemos  visto que la conversión entre sistemas de numeración es simple y lógico. Pero no siempre es así. Por algún extraño motivo, si intentamos convertir directamente de hexadecimal a binario como hemos hecho el resto de conversiones:

#!/bin/bash

let binario=1111

hexadecimal=$(echo "ibase=2;obase=16;$binario" | bc)

echo El número binario $binario en hexadecimal es $hexadecimal

Nos devuelve esto:

El número binario 1111 en hexadecimal es 120

Y no sólo en este valor, sino en cualquier otro valor:

El número binario 11111111 en hexadecimal es 100110

A simple vista podemos ver que algo falla. No puede devolver ese resultado. Pero vamos a comprobar el fallo convirtiendo los dos valores a decimal y comprobando si son iguales:

#!/bin/bash

let binario=11111111

hexadecimal=$(echo "ibase=2;obase=16;$binario" | bc)

echo El número binario $binario en hexadecimal es $hexadecimal

decimal=$(echo "ibase=2; $binario" | bc)
decimal2=$(echo "ibase=16; $hexadecimal" | bc)

echo $binario en decimal es $decimal 
echo $hexadecimal en decimal es $decimal2

Que nos devuelve:

El número binario 11111111 en hexadecimal es 100110
11111111 en decimal es 255
100110 en decimal es 1048848

Por lo que no hay duda de que algo falla. Así que debemos solucionarlo. Una opción puede ser convertir de binario a decimal y de decimal a hexadecimal:

#!/bin/bash

let binario=11111111

decimal=$(echo "ibase=2; $binario" | bc)
hexadecimal=$(echo "ibase=10;obase=16;$decimal" | bc)

echo El número binario $binario en hexadecimal es $hexadecimal

decimal=$(echo "ibase=2; $binario" | bc)
decimal2=$(echo "ibase=16; $hexadecimal" | bc)

echo $binario en decimal es $decimal 
echo $hexadecimal en decimal es $decimal2

Y, ahora sí, nos devuelve el resultado esperado:

El número binario 11111111 en hexadecimal es FF
11111111 en decimal es 255
FF en decimal es 255

 

 

Deja una respuesta

Tu dirección de correo electrónico no será publicada.