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