2012-04-23 38 views
24

Tôi đang tìm cách dễ dàng trong Bash để chuyển đổi số thập phân sang số nhị phân. Tôi có các biến cần được chuyển đổi:Vỏ băm Thập phân để chuyển đổi nhị phân

$ip1 $ip2 $ip3 $ip4 

Có phương pháp đơn giản nào để thực hiện việc này mà không cần xem từng số riêng lẻ?

Tôi không muốn viết nhiều mã.

Trả lời

45

Bạn có thể sử dụng bc như:

echo "obase=2;$ip1" | bc 

See it

+0

Điều đó thật tuyệt!nhờ heaps tôi đã có cú pháp sai U_U lol –

+0

Hiện tại tôi có echo "obase = 2; $ ip1" | bc echo "obase = 2; $ ip2" | bc echo "obase = 2; $ ip3" | bc echo "obase = 2; $ ip4" | bc và tiếng vọng mỗi dòng được tạo ra một dòng mới. là có một cách để có đầu ra tip để đuôi –

+0

@ DanielDC: Bạn có thể làm: 'echo" obase = 2; 10; 20; 30 "| bc | tr -d '\ n'' – codaddict

1

Decimal để chuyển đổi nhị phân trong Bash:

Tôi đang sử dụng Ubuntu 14.04 để làm điều này.

Chuyển đổi số thập phân từ 1 đến 5 thành nhị phân.

[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 dụ:

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

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

Chuyển đổi số thập phân sang nhị phân với các lệnh bash BUILTIN (khoảng từ 0 đến 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]} 

Để loại bỏ số không hàng đầu, ví dụ từ ${D2B[7]}:

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

này tạo ra một mảng với 00000000 00000001 00000010 ... 11111101 11111110 11111111 với bash của brace expansion. Vị trí trong mảng D2B thể hiện giá trị thập phân của nó.

Xem thêm: Understanding code ({0..1}{0..1}{0..1}{0..1}{0..1}{0..1}{0..1}{0..1})

+2

Giải pháp bash tinh khiết rất đẹp! Để khái quát hóa điều này cho phạm vi từ 0 đến 2^n-1, sử dụng 'eval D2B = '(' $ (cho ((i = 0; i <$ n; i ++)); làm printf '% s'" {0 .. 1} "; done) ')'' (sau khi thiết lập 'n'). Hạn chế duy nhất là phương pháp này có không gian O (2^n) (siêu đa thức!). Điều này nhanh chóng rút ra khó sử dụng. –

+0

Giải pháp chặt chẽ đáng kinh ngạc! Bạn có thể giải thích những gì sẽ xảy ra? '{0..1}' là gì? – domih

+2

@domih: Tôi đã cập nhật câu trả lời của mình. – Cyrus

3

phương pháp chung để chuyển đổi một số nguyên thành đại diện khác với một cơ sở (nhưng cơ sở < = 10 vì sử dụng 0..9 chữ số cho đại diện, chỉ):

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 
} 

ví dụ

convertIntvalToBase $ip1 2  # converts $ip1 into binary representation 
Các vấn đề liên quan