注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

民主与科学

独立之人格,自由之思想

 
 
 

日志

 
 

二进制到十进制的转换  

2011-08-19 14:55:11|  分类: Linux脚本集 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
本文是一个把二进制数转换为十进制数功能的shell脚本实例。这也是一个用expr命令进行数学运算的例子: 
文件b2h.sh
#!/bin/sh 
# vim: set sw=4 ts=4 et: 
help() 
echo "b2h -- convert binary to decimal" 
echo "USAGE: b2h [-h] binarynum" 
echo "OPTIONS: -h help text" 
echo "EXAMPLE: b2h 111010 wiil be 58"
exit 0 
error() 
# print an error and exit 
echo "$1" 
exit 1 
lastchar() 
# return the last character of a string in $rval 
if [ -z "$1" ]; then 
# empty string 
rval="" 
return 
fi 
# wc puts some space behind the output this is why we need sed: 
numofchar=`echo -n "$1" | wc -c | sed 's/ //g' ` 
# now cut out the last char 
rval=`echo -n "$1" | cut -b $numofchar` 
}
chop() 
# remove the last character in string and return it in $rval 
if [ -z "$1" ]; then 
# empty string 
rval="" 
return 
fi 
# wc puts some space behind the output this is why we need sed: 
numofchar=`echo -n "$1" | wc -c | sed 's/ //g' ` 
if [ "$numofchar" = "1" ]; then 
# only one char in string 
rval="" 
return 
fi 
numofcharminus1=`expr $numofchar "-" 1` 
# now cut all but the last char: 
rval=`echo -n "$1" | cut -b 1-${numofcharminus1}` 
while [ -n "$1" ]; do 
case $1 in 
-h) help;shift 1;; # function help is called 
-*) error "error: no such option $1. -h for help";; 
*) break;; 
esac 
done 
# The main program 
sum=0 
weight=1 
# one arg must be given: 
[ -z "$1" ] && help 
binnum="$1" 
binnumorig="$1"
while [ -n "$binnum" ]; do 
lastchar "$binnum" 
if [ "$rval" = "1" ]; then 
sum=`expr "$weight" "+" "$sum"` 
fi 
# remove the last position in $binnum 
chop "$binnum" 
binnum="$rval" 
weight=`expr "$weight" "*" 2` 
done 
echo "binary $binnumorig is decimal $sum" 
该脚本使用的算法是利用十进制和二进制数权值 (1,2,4,8,16,..),比如二进制"10"可
以这样转换成十进制: 
0 * 1 + 1 * 2 = 2 
为了得到单个的二进制数我们是用了lastchar 函数。该函数使用wc –c计算字符个数,
然后使用cut命令取出末尾一个字符。Chop函数的功能则是移除最后一个字符。

rval=`echo -n "$1" | cut -b $numofchar` 
这里cut的意思是提取位置$numofchar的这个字符,字符为位置是从1开始计算的
rval=`echo -n "$1" | cut -b 1-${numofcharminus1}` 
这里cut的意思是提取从位置1位置${numofcharminus1}个字符,该语句是闭包含。字符位置是从1开始计算的。
另外,"shift 1"是把脚本文件传入参数编号起点从左向右移一位的意思。
  评论这张
 
阅读(492)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017