I: 利用obase, ibase和bc:
ibase是输入数字的进制,而obase就是输出数字的进制了。很好记,i是input,o是output。
注意,16进制数字的F要大写,否则,结果为0,是错误的。
举例说明:
10进制转2进制:
-
[15:14:20-Bob@hzling08:~]-(1004)No.4->$ echo "obase=2;ibase=10;255" | bc
-
11111111
10进制转16进制: (如果输入是10进制的话,ibase可省略)
-
[15:14:26-Bob@hzling08:~]-(1005)No.5->$ echo "obase=16;ibase=10;255" | bc
-
FF
-
[15:15:04-Bob@hzling08:~]-(1006)No.6->$ echo "obase=16;255" | bc
-
FF
16进制转2进制:
-
[15:17:28-Bob@hzling08:~]-(1013)No.13->$ echo "ibase=16;obase=2;FF" | bc
-
11111111
16进制转10进制:(此时,只需指定ibase即可)
-
[15:17:24-Bob@hzling08:~]-(1012)No.12->$ echo "ibase=16;FF" | bc
-
255
II: 利用echo的base#:
$((base#number))
#其中number是欲转化的数,base是其进制数.(base也可省略,number默认是十进制,如果以0,或0x则分别是八进制和十六进制).
-
#echo $((012)) #8进制,结果为10
-
#echo $((0xFF)) #16进制,结果为255
-
#echo $((0xEF))
-
#echo $((0xFFFF))
-
#echo $((2#1101011))
-
#echo $((2#11111111)) #2进制,结果为255
-
#echo $((8#255)) #8进制,结果为173
-
#echo $((8#377)) #16进制,结果为217
-
#echo $((16#D9))
-
#echo $((16#FF)) #有base不用0x,不然报错!8进制没问题!
另外这个用法还可以扩展:
$((base#number^base#Base1)) #可以理解为number和Base1这两者按照base进制做了个异或操作.
比如:
-
#base=1f
-
#Base1=ff
-
#echo $((16#$base^16#$Base1))
-
224
-
#这个例子就表示,base(1f)和Base1(ff)按照16进制做了异或操作(结果为e0,即224)
III: 例子:
Question:
现在想对两个二进制数据进行 或 运算, 如
a= 1101
b= 1000
c= a|b
以二进制格式输出c = 1101 ???
Answer:
-
[Bob@hzling08:~]-No.96-$ a=1101; b=1000
-
[Bob@hzling08:~]-No.97-$ d=`echo $(($((2#$a))|$((2#$b)))) | bc`
-
[Bob@hzling08:~]-No.98-$ echo "obase=2; $d" | bc
-
1101
其实可以写成一句:
-
[Bob@hzling08:~]-No.99-$ echo "obase=2;$(($((2#$a))|$((2#$b))))" | bc
-
1101
IV: 补充:
1. 利用awk:
-
-
echo 0x2A | gawk '$1=strtonum($1)'
-
-
-
printf "%f\n" 3.1188622400e+06
-
echo 3.1188622400e+06 | awk '{printf("%f\n",$0)}'
-
-
-
echo 3.1188622400e+06 | awk '{printf("%.2f\n",$0)}'
-
-
-
printf "%.f\n" 3.1188622400e+06
-
echo 3.1188622400e+06 | awk '{printf("%d\n",$0)}'
-
-
-
echo 3.1188622400e+06 | awk '{printf("%d\n",$0+0.5)}'
2.ksh中:
-
-
num=42
-
typeset -i2 num
-
echo $num
-
typeset -i8 num
-
echo $num
-
typeset -i16 num
-
echo $num
V: 其他
此外,dc也可以办到,如: