Chinaunix首页 | 论坛 | 博客
  • 博客访问: 54269
  • 博文数量: 28
  • 博客积分: 84
  • 博客等级: 民兵
  • 技术积分: 162
  • 用 户 组: 普通用户
  • 注册时间: 2010-05-09 17:47
个人简介

try vuuv.github.io or somewhere else.

文章分类

全部博文(28)

文章存档

2013年(1)

2012年(5)

2011年(22)

我的朋友

分类: LINUX

2011-12-09 19:04:11

一直转帖充门面, 先原创一篇(没google到类似的)
 
  1. #! /bin/bash
  2. # 十进制正整数转化为二进制.
  3. # 测试于bash-2.05a, 惟吾无为 编写
  4. # 参数1, 待转换的十进制数; 参数2, 输出位数, 不足则在前面补0, 超过不处理.
  5. # 示例: utob 0 5, 显示5个0. utob 5 0, 显示101.
  6. utob(){
  7. # 十进制正整数转化为二进制.
  8. # 测试于bash-2.05a
  9. # 先转化为八进制.
  10. vuuv_utob=$(printf %o $1)
  11. # 先替换所有的0, 然后替换1 (1会被替换为001, 以防干扰)
  12. # 最后其他数字顺序随意, 因为二进制只有0和1
  13. vuuv_utob=${vuuv_utob//0/000}
  14. vuuv_utob=${vuuv_utob//1/001}
  15. vuuv_utob=${vuuv_utob//2/010}
  16. vuuv_utob=${vuuv_utob//3/011}
  17. vuuv_utob=${vuuv_utob//4/100}
  18. vuuv_utob=${vuuv_utob//5/101}
  19. vuuv_utob=${vuuv_utob//6/110}
  20. vuuv_utob=${vuuv_utob//7/111}
  21. # $(())去掉数字前面的0, 前面的10#把vuuv_utob视作10进制数处理, 防止bash把2进制又给转成10进制了-_-b
  22. # $2指定输出长度, 空则为0, 输出不足$2位则前补0, 否则不处理.
  23. printf "%0*s\n" "$2" $((10#$vuuv_utob))
  24. }
  25. utob $@
  26. # 删除变量
  27. unset vuuv_utob
  28. exit 0
  29. 10进制转换为2进制, 纯bash, 非短除法
  30. 昨天睡前想到的, 今天上午实践, 40分钟前编写及调试.
  31. 现在明目张胆的直接输入中文, 因为上面已经退出了^_^
  32. 原理:
  33. 先上表:
  34. 十进制 0 1 2 3 4 5 6 7 8 9
  35. 八进制 0 1 2 3 4 5 6 7 10 11
  36. 二进制 000 001 010 011 100 101 110 111 1000 1001
  37. 可以看到, 十进制8被转换为八进制10, 分隔开来转换为二进制
  38. 就是001 000, 去掉前面的0, 就是1000了.
  39. 为何这样可行? 因为2^3=8. 3个二进制一组, 就是一个八进制数.
  40. 所以二进制数1000先补全长度为3的倍数, 及001000.
  41. 每三个一组, 001(2) --> 1(8), 000(2) --> 0(8).
  42. 组合起来, 就是10了. 此操作可逆, 也是8进制可以替换为2进制的原因.
  43. 16进制就是每4位一读了. 但那样就需要16个替换操作. 不方便.
阅读(1298) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~