2012-04-23 10 views
24

Ich bin auf der Suche nach einem einfachen Weg in Bash, um eine Dezimalzahl in eine Binärzahl zu konvertieren. Ich habe Variablen, die konvertiert werden müssen:Bash Shell Dezimal zu Binär Konvertierung

$ip1 $ip2 $ip3 $ip4 

Gibt es eine einfache Methode, dies bei jeder einzelnen Zahl, ohne zu sehen, zu tun?

Ich würde es vorziehen, nicht viel Code schreiben zu müssen.

Antwort

45

können Sie verwenden bc als:

echo "obase=2;$ip1" | bc 

See it

+0

Das funktioniert gut!danke haufen ich hatte die falsche syntax U_U lol –

+0

Im moment habe ich echo "obase = 2; $ ip1" | bc echo "obase = 2; $ ip2" | bc echo "obase = 2; $ ip3" | bc echo "obase = 2; $ ip4" | bc und das Echo jeder Zeile gibt einen Zeilenumbruch aus. gibt es eine Möglichkeit, es von Spitze zu Ende ausgeben zu lassen –

+0

@DanielDC: Sie können tun: 'echo" obase = 2; 10; 20; 30 "| bc | tr -d '\ n'' – codaddict

1

Dezimal zu Binär-Umwandlung in Bash:

ich 14,04 bin mit Ubuntu, dies zu tun.

Konvertieren Sie die Dezimalstellen 1 bis 5 in Binärwerte.

[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 Beispiel:

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

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

Convert dezimale binäre Befehle mit bash gebautet (Bereich 0 bis 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]} 

um führende Nullen zu entfernen, z.B. von ${D2B[7]}:

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

Dies erzeugt ein Array mit 00000000 00000001 00000010 ... 11111101 11111110 11111111 mit bash brace expansion. Die Position im Array D2B repräsentiert ihren Dezimalwert.

Siehe auch: Understanding code ({0..1}{0..1}{0..1}{0..1}{0..1}{0..1}{0..1}{0..1})

+2

Sehr schöne reine Bash-Lösung! Um dies für den Bereich 0 bis 2^n-1 zu verallgemeinern, benutze 'eval D2B = '(' $ (for ((i = 0; i <$ n; i ++)); tue printf '% s'" {0 .. 1} "; done) ')'' (nach dem Setzen von 'n'). Der einzige Nachteil ist, dass diese Methode O (2^n) Raum einnimmt (Superpolynom!). Das zieht schnell unhandlich. –

+0

Unglaubliche enge Lösung! Kannst du erklären, was passiert? Was bedeutet '{0..1}'? – domih

+2

@domih: Ich habe meine Antwort aktualisiert. – Cyrus

3

Allgemeine Methode für eine ganze Zahl in einer anderen Darstellung mit einer anderen Basis Umwandlung (aber Basis < = 10, weil der Ziffern 0..9 für die Darstellung verwendet wird, nur):

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 
} 

z

convertIntvalToBase $ip1 2  # converts $ip1 into binary representation