Copy from
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中:
- #ksh中的进制转换
- num=42
- typeset -i2 num
- echo $num
- typeset -i8 num
- echo $num
- typeset -i16 num
- echo $num
V: 其他
此外,dc也可以办到,如:
- echo 255 16op|dc
- FF