2012-04-23 2 views
24

Я ищу простой способ в Bash конвертировать десятичное число в двоичное число. У меня есть переменные, которые необходимо преобразовать:Bash shell Decimal to Binary conversion

$ip1 $ip2 $ip3 $ip4 

Есть ли простой способ сделать это, не глядя на каждый индивидуальный номер?

Я бы предпочел не писать много кода.

ответ

45

Вы можете использовать bc как:

echo "obase=2;$ip1" | bc 

See it

+0

Это отлично работает!спасибо кучи, у меня был неправильный синтаксис U_U lol –

+0

На данный момент у меня есть echo "obase = 2; $ ip1" | bc echo "obase = 2; $ ip2" | bc echo "obase = 2; $ ip3" | bc echo "obase = 2; $ ip4" | bc и эхо каждой строки выводит новую строку. есть способ получить кончик вывода до конца –

+0

@ DanielDC: Вы можете сделать: 'echo 'obase = 2; 10; 20; 30" | bc | tr -d '\ n'' – codaddict

1

десятичном в двоичные преобразования в Bash:

Я использую Ubuntu 14.04, чтобы сделать это.

Преобразуйте десятичные знаки с 1 по 5 в двоичные. Пример

[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 

Бонус:

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

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

Преобразование десятичного в двоичный с Баш встроенных команд (диапазон от 0 до 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]} 

Чтобы удалить начальные нули, например, от ${D2B[7]}:

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

Это создает массив с 00000000 00000001 00000010 ... 11111101 11111110 11111111 с Баш-х brace expansion. Позиция в массиве D2B представляет его десятичное значение.

Смотрите также: Understanding code ({0..1}{0..1}{0..1}{0..1}{0..1}{0..1}{0..1}{0..1})

+2

Очень хорошее чистое решение bash! Чтобы обобщить это для диапазона от 0 до 2^n-1, используйте 'eval D2B = '(' $ (for ((i = 0; i <$ n; i ++)); do printf '% s'" {0 .. 1} "; done) ')'' (после установки 'n'). Единственным недостатком является то, что этот метод принимает O (2^n) пространство (суперполиномиально!). Это быстро становится громоздким. –

+0

Невероятное плотное решение! Можете ли вы объяснить, что происходит? Что означает '{0..1}'? – domih

+2

@domih: Я обновил свой ответ. – Cyrus

3

Общий метод для преобразования целого числа в другое представление с другим основанием (но основанием < = 10 из-за использования цифр 0..9 для представления только):

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 
} 

например

convertIntvalToBase $ip1 2  # converts $ip1 into binary representation