- 论坛徽章:
- 0
|
本帖最后由 xiaopan3322 于 2011-05-03 15:22 编辑
刚好看到有关于进制转换的问题,这里小结一下,欢迎补充……欢迎指正……(printf 就算了……)
注:
本文只涉及bash……
关于其他,例如ksh,请参看4楼Shell_HAT版主的回复……
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
复制代码 |
评分
-
查看全部评分
|