2012-04-23 133 views
24

Estoy buscando una manera fácil en Bash de convertir un número decimal en un número binario. Tengo variables que necesitan ser convertidas:Bash shell De decimal a conversión binaria

$ip1 $ip2 $ip3 $ip4 

¿Hay un método simple para hacer esto sin mirar cada número individual?

Preferiría no tener que escribir mucho código.

Respuesta

45

Se puede utilizar como bc:

echo "obase=2;$ip1" | bc 

See it

+0

Eso funciona genial!gracias montones que tenía la sintaxis incorrecta U_U lol –

+0

Por el momento tengo echo "obase = 2; $ ip1" | bc echo "obase = 2; $ ip2" | bc echo "obase = 2; $ ip3" | bc echo "obase = 2; $ ip4" | bc y el eco de cada línea está produciendo una nueva línea. hay una manera de tener su salida punta a cola –

+0

@DanielDC: Puede hacer: 'echo" obase = 2; 10; 20; 30 "| bc | tr -d '\ n'' – codaddict

1

decimal a la conversión binaria en Bash:

estoy usando Ubuntu 14.04 para hacer esto.

Convierte los decimales del 1 al 5 en binarios. ejemplo

[email protected]:~$ bc <<< "obase=2;1" 
1 
[email protected]:~$ bc <<< "obase=2;2" 
10 
[email protected]:~$ bc <<< "obase=2;3" 
11 
[email protected]:~$ bc <<< "obase=2;4" 
100 
[email protected]:~$ bc <<< "obase=2;5" 
101 

Bonus:

[email protected]:~$ bc <<< "obase=2;1024" 
10000000000 

[email protected]:~$ bc <<< "obase=2;2^128" 
100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 
24

Convert decimal a binario con comandos de bash orden interna (rango de 0 a 255):

D2B=({0..1}{0..1}{0..1}{0..1}{0..1}{0..1}{0..1}{0..1}) 

echo ${D2B[7]} 
echo ${D2B[85]} 
echo ${D2B[127]} 

Para eliminar los ceros iniciales, por ejemplo de ${D2B[7]}:

echo $((10#${D2B[7]})) 

Esto crea una matriz con 00000000 00000001 00000010 ... 11111101 11111110 11111111 con fiesta de brace expansion. La posición en la matriz D2B representa su valor decimal.

Consulte también: Understanding code ({0..1}{0..1}{0..1}{0..1}{0..1}{0..1}{0..1}{0..1})

+2

Muy buena solución pura bash! Para generalizar esto para el rango de 0 a 2^n-1, use 'eval D2B = '(' $ (para ((i = 0; i <$ n; i ++)); do printf '% s'" {0 .. 1} "; hecho) ')'' (después de configurar 'n'). El único inconveniente es que este método toma O (2^n) espacio (¡superpolinomial!). Esto rápidamente se vuelve difícil de manejar. –

+0

¡Solución apretada increíble! ¿Puedes explicar lo que sucede? ¿Qué significa '{0..1}'? – domih

+2

@domih: He actualizado mi respuesta. – Cyrus

3

método general para convertir un número entero en otra representación con otra base (pero base de < = 10 debido a usar 0..9 dígitos para la representación, solamente):

function convertIntvalToBase() # (Val Base) 
{ 
    val=$1 
    base=$2 
    result="" 
    while [ $val -ne 0 ] ; do 
     result=$(($val % $base))$result #residual is next digit 
     val=$(($val/$base)) 
    done 
    echo -n $result 
} 

por ej.

convertIntvalToBase $ip1 2  # converts $ip1 into binary representation 
Cuestiones relacionadas