Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1110123
  • 博文数量: 254
  • 博客积分: 1242
  • 博客等级: 少尉
  • 技术积分: 1581
  • 用 户 组: 普通用户
  • 注册时间: 2012-05-03 21:49
文章分类

全部博文(254)

文章存档

2017年(16)

2016年(4)

2013年(94)

2012年(140)

分类: LINUX

2013-04-26 10:00:43

原文地址:进制转换小结 作者:weilanse

Copy from 


I: 利用obase, ibase和bc:

ibase是输入数字的进制,而obase就是输出数字的进制了。很好记,i是input,o是output。
注意,16进制数字的F要大写,否则,结果为0,是错误的。

举例说明:

10进制转2进制:

  1. [15:14:20-Bob@hzling08:~]-(1004)No.4->$ echo "obase=2;ibase=10;255" | bc      
  2. 11111111  

10进制转16进制: (如果输入是10进制的话,ibase可省略)

  1. [15:14:26-Bob@hzling08:~]-(1005)No.5->$ echo "obase=16;ibase=10;255" | bc     
  2. FF   
  3. [15:15:04-Bob@hzling08:~]-(1006)No.6->$ echo "obase=16;255" | bc           
  4. FF  

16进制转2进制:

  1. [15:17:28-Bob@hzling08:~]-(1013)No.13->$ echo "ibase=16;obase=2;FF" | bc    
  2. 11111111  

16进制转10进制:(此时,只需指定ibase即可)

  1. [15:17:24-Bob@hzling08:~]-(1012)No.12->$ echo "ibase=16;FF" | bc   
  2. 255  

II: 利用echo的base#:

$((base#number))
#其中number是欲转化的数,base是其进制数.(base也可省略,number默认是十进制,如果以0,或0x则分别是八进制和十六进制).

  1. #echo $((012)) #8进制,结果为10   
  2. #echo $((0xFF)) #16进制,结果为255   
  3. #echo $((0xEF))   
  4. #echo $((0xFFFF))   
  5. #echo $((2#1101011))   
  6. #echo $((2#11111111)) #2进制,结果为255   
  7. #echo $((8#255)) #8进制,结果为173   
  8. #echo $((8#377)) #16进制,结果为217   
  9. #echo $((16#D9))   
  10. #echo $((16#FF)) #有base不用0x,不然报错!8进制没问题!  

另外这个用法还可以扩展:

$((base#number^base#Base1)) #可以理解为number和Base1这两者按照base进制做了个异或操作.

比如:

  1. #base=1f  
  2. #Base1=ff  
  3. #echo $((16#$base^16#$Base1))   
  4. 224   
  5. #这个例子就表示,base(1f)和Base1(ff)按照16进制做了异或操作(结果为e0,即224)  

III: 例子:

Question:

现在想对两个二进制数据进行 或 运算, 如
a= 1101
b= 1000
c= a|b
以二进制格式输出c = 1101 ???

Answer:

  1. [Bob@hzling08:~]-No.96-$ a=1101b=1000  
  2. [Bob@hzling08:~]-No.97-$ d=`echo $(($((2#$a))|$((2#$b)))) | bc`   
  3. [Bob@hzling08:~]-No.98-$ echo "obase=2; $d" | bc                 
  4. 1101  

其实可以写成一句:

  1. [Bob@hzling08:~]-No.99-$ echo "obase=2;$(($((2#$a))|$((2#$b))))" | bc   
  2. 1101  

IV: 补充:

1. 利用awk:

  1. #十六进制转十进制   
  2. echo 0x2A | gawk '$1=strtonum($1)'   
  3.   
  4. #科学计数法转十进制   
  5. printf "%f\n" 3.1188622400e+06   
  6. echo 3.1188622400e+06 | awk '{printf("%f\n",$0)}'   
  7.   
  8. #科学计数法转十进制并保留两位小数   
  9. echo 3.1188622400e+06 | awk '{printf("%.2f\n",$0)}'   
  10.   
  11. #科学计数法转十进制并取整   
  12. printf "%.f\n" 3.1188622400e+06   
  13. echo 3.1188622400e+06 | awk '{printf("%d\n",$0)}'   
  14.   
  15. #科学计数法转十进制并四舍五入取整   
  16. echo 3.1188622400e+06 | awk '{printf("%d\n",$0+0.5)}'  

2.ksh中:

  1. #ksh中的进制转换   
  2. num=42   
  3. typeset -i2 num   
  4. echo $num  
  5. typeset -i8 num   
  6. echo $num  
  7. typeset -i16 num   
  8. echo $num  

V: 其他

此外,dc也可以办到,如:

  1. echo 255 16op|dc   
  2. FF  

阅读(1025) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~