免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 6826 | 回复: 15
打印 上一主题 下一主题

进制转换小结 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-05-02 23:16 |只看该作者 |倒序浏览
本帖最后由 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进制:
  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#:
  1. $((base#number))
  2. #其中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进制没问题!
复制代码
另外这个用法还可以扩展:
  1. $((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=1101; b=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
复制代码

评分

参与人数 1可用积分 +6 信誉积分 +2 收起 理由
expert1 + 6 + 2 hao

查看全部评分

论坛徽章:
0
2 [报告]
发表于 2011-05-02 23:26 |只看该作者
回复 1# xiaopan3322


    $((base#number^base#Base1))    #这种情况是把number以Base1为基进行取反操作.
这个没看懂 能详细说一下么?
没见过这个用法 呵呵

论坛徽章:
33
ChinaUnix元老
日期:2015-02-02 08:55:39CU十四周年纪念徽章
日期:2019-08-20 08:30:3720周年集字徽章-周	
日期:2020-10-28 14:13:3020周年集字徽章-20	
日期:2020-10-28 14:04:3019周年集字徽章-CU
日期:2019-09-08 23:26:2519周年集字徽章-19
日期:2019-08-27 13:31:262016科比退役纪念章
日期:2022-04-24 14:33:24
3 [报告]
发表于 2011-05-02 23:27 |只看该作者
本帖最后由 Shell_HAT 于 2011-05-03 12:13 编辑
  1. #十六进制转十进制
  2. echo 0x2A | gawk '$1=strtonum($1)'

  3. #科学计数法转十进制
  4. printf "%f\n" 3.1188622400e+06
  5. echo 3.1188622400e+06 | awk '{printf("%f\n",$0)}'

  6. #科学计数法转十进制并保留两位小数
  7. echo 3.1188622400e+06 | awk '{printf("%.2f\n",$0)}'

  8. #科学计数法转十进制并取整
  9. printf "%.f\n" 3.1188622400e+06
  10. echo 3.1188622400e+06 | awk '{printf("%d\n",$0)}'

  11. #科学计数法转十进制并四舍五入取整
  12. echo 3.1188622400e+06 | awk '{printf("%d\n",$0+0.5)}'
复制代码

论坛徽章:
33
ChinaUnix元老
日期:2015-02-02 08:55:39CU十四周年纪念徽章
日期:2019-08-20 08:30:3720周年集字徽章-周	
日期:2020-10-28 14:13:3020周年集字徽章-20	
日期:2020-10-28 14:04:3019周年集字徽章-CU
日期:2019-09-08 23:26:2519周年集字徽章-19
日期:2019-08-27 13:31:262016科比退役纪念章
日期:2022-04-24 14:33:24
4 [报告]
发表于 2011-05-02 23:35 |只看该作者
  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
复制代码

论坛徽章:
0
5 [报告]
发表于 2011-05-02 23:37 |只看该作者
回复  xiaopan3322


    $((base#number^base#Base1))    #这种情况是把number以Base1为基进行取反操作 ...
lkk2003rty 发表于 2011-05-02 23:26



    我已更新说法,原来的说法看起来比较拗口,实际上就是两者按照16进制做了个异或:
1f: 00011111
ff:  11111111
-------异或-----
e0:11100000
即224

论坛徽章:
0
6 [报告]
发表于 2011-05-02 23:40 |只看该作者
Shell_HAT 发表于 2011-05-02 23:35



    学习,ksh中,原来还能这么灵活……

论坛徽章:
33
ChinaUnix元老
日期:2015-02-02 08:55:39CU十四周年纪念徽章
日期:2019-08-20 08:30:3720周年集字徽章-周	
日期:2020-10-28 14:13:3020周年集字徽章-20	
日期:2020-10-28 14:04:3019周年集字徽章-CU
日期:2019-09-08 23:26:2519周年集字徽章-19
日期:2019-08-27 13:31:262016科比退役纪念章
日期:2022-04-24 14:33:24
7 [报告]
发表于 2011-05-02 23:42 |只看该作者
回复 1# xiaopan3322


或运算可以写简单点:
  1. echo "obase=2;$((2#1101|2#1000))" | bc
复制代码

论坛徽章:
33
ChinaUnix元老
日期:2015-02-02 08:55:39CU十四周年纪念徽章
日期:2019-08-20 08:30:3720周年集字徽章-周	
日期:2020-10-28 14:13:3020周年集字徽章-20	
日期:2020-10-28 14:04:3019周年集字徽章-CU
日期:2019-09-08 23:26:2519周年集字徽章-19
日期:2019-08-27 13:31:262016科比退役纪念章
日期:2022-04-24 14:33:24
8 [报告]
发表于 2011-05-02 23:44 |只看该作者
回复 5# xiaopan3322


是否考虑把顶楼“取反操作”这个词语去掉?
取反操作:~
异或操作:^

论坛徽章:
0
9 [报告]
发表于 2011-05-02 23:59 |只看该作者
回复  xiaopan3322


是否考虑把顶楼“取反操作”这个词语去掉?
取反操作:~
异或操作:^
Shell_HAT 发表于 2011-05-02 23:44



    恩,我表述的确实有问题(我本意是想把异或操作用取反操作来简单化,没想到变得这么难理解,囧)……
    另,我在开头加注了bash和ksh环境区别……

论坛徽章:
3
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:51:162015年亚洲杯之阿曼
日期:2015-04-07 20:00:59
10 [报告]
发表于 2011-05-03 09:21 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP