LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1005|回复: 8

十进制 到 二进制 的转换脚本

[复制链接]
发表于 2004-12-30 22:01:12 | 显示全部楼层 |阅读模式
  1. #!/bin/bash
  2. # convert number from decimal to binary
  3. # version 0.1.0
  4. #  2004-12-30

  5. a=$1
  6. while [ $a != 0 ]
  7. do
  8. b=$(echo -n "$[$a%2]$b")
  9. a=$[$a/2]
  10. done
  11. echo $b
复制代码
发表于 2004-12-31 12:25:25 | 显示全部楼层
厉害。有学到了东东。谢谢。
发表于 2004-12-31 17:20:21 | 显示全部楼层
Post by linux_now
  1. #!/bin/bash
  2. # convert number from decimal to binary
  3. # version 0.1.0
  4. #  2004-12-30

  5. a=$1
  6. while [ $a != 0 ]
  7. do
  8. b=$(echo -n "$[$a%2]$b")
  9. a=$[$a/2]
  10. done
  11. echo $b
复制代码

那么复杂 :-)

  1. echo "ibase=10;obase=2;$1"|bc
复制代码
发表于 2004-12-31 22:50:24 | 显示全部楼层
echo "ibase=10;obase=2;$1"|bc

这招比较牛,但楼主的办法也好,如果没有 bc 呢。
发表于 2005-1-1 04:09:04 | 显示全部楼层
Post by 弥敦路九号
echo "ibase=10;obase=2;$1"|bc

这招比较牛,但楼主的办法也好,如果没有 bc 呢。

  1. #!/bin/ksh
  2. typeset -i2 var=$1
  3. echo ${var#*#}
复制代码
 楼主| 发表于 2005-1-1 09:22:49 | 显示全部楼层
太好了 :thank

这么多方法
我的方法有个局限:只能用在正整数的情况下。
发表于 2005-1-1 23:44:57 | 显示全部楼层
Post by tcpip

  1. #!/bin/ksh
  2. typeset -i2 var=$1
  3. echo ${var#*#}
复制代码


你这招用的是 ksh 显示N进制位数的特性,在 bash 里就行不通。我还是喜欢你 bc 那招。
因为我机有bc 没 ksh
 楼主| 发表于 2005-1-5 11:13:40 | 显示全部楼层
今天把她改进了一下,增加了十进制实数的转换(默认精度为16位);有空帮忙测试一下,看看还有没有bug
:thank

2005-01-12
代码增加到183行,真搞笑
修正了三个bug:
+123不能正确计算;123.[+-]123被认为是合法;--scale 0时输出小数点。

2005-01-16
增加对旧版本coreutils的检测。



  1. #!/bin/bash
  2. #          a bash scripts for
  3. #   convert number from decimal to binary
  4. #  limit length 18bit of decimal by "test"
  5. #            version 0.9.1
  6. #             2005-01-16


  7. # test test version
  8. test 1a -lt 0 2>/dev/null
  9. if [ "$?" -eq 1 ]
  10. then
  11. echo "Your coreutils too old! Please upgrade."
  12. exit 1
  13. fi

  14. # function; help
  15. d2b_help (){
  16. echo " Decimal to Binary convertion version 0.9.0 2005-01-12"
  17. echo -e "  Usage: bash $0 number [--scale n]\n   e.g.: bash $0 12315 --scale 5\n\
  18.          bash $0 12315"
  19. exec 2>&1
  20. exit 1
  21. }

  22. if [ "$1" = "" -o "$1" = "-h" ]
  23. then
  24. d2b_help
  25. fi

  26. exec 2>/dev/null
  27. SCALE=16
  28. if [ "$1" = "--scale" -a $2 -ge 0 ]
  29. then SCALE=$2
  30. shift
  31. shift
  32. else if [ "$2" = "--scale" -a $3 -ge 0 ]
  33. then SCALE=$3
  34. fi
  35. fi

  36.                 # function: cut the prefixed 0
  37.                 prefix (){
  38.                 until [ $a -ne ${a#?} ]
  39.                 do
  40.                         a=${a#0}
  41.                         if [ ${#a} -eq 1 ]
  42.                         then break
  43.                         fi
  44.                 done
  45.                 }
  46.                 # function: output result
  47.                 d2b_output (){
  48.                 if [ $SCALE -eq 0 ]
  49.                 then
  50.                         b=${b%.*}
  51.                 fi
  52.                 echo $b
  53.                 exec 2>&1
  54.                 exit 0
  55.                 }

  56. # if it is integer?
  57. test $1 -eq 0
  58. case $?
  59. in

  60. 0)
  61.         b=0
  62.         d2b_output
  63.         ;;
  64.        
  65. 1)
  66.         b=""
  67.         if [ "$1" -gt 0 ]
  68.         then
  69.                 a=${1#+}
  70.                 prefix

  71.                 while [ $a -ne 0 ]
  72.                 do
  73.                         b=$[$a%2]$b
  74.                         a=$[$a/2]
  75.                 done
  76.                 d2b_output
  77.         else
  78.                 a=${1#-}
  79.                 prefix

  80.                 while [ $a -ne 0 ]
  81.                 do
  82.                         b=$[$a%2]$b
  83.                         a=$[$a/2]
  84.                 done
  85.                 b=-$b
  86.                 d2b_output
  87.         fi
  88.         ;;

  89. *)
  90.         # if it is real number?
  91.         test ${1#*.} -eq 0 && test ${1%.*} -eq 0
  92.         case $?
  93.         in
  94.         0)
  95.                 b=0
  96.                 d2b_output
  97.                 ;;
  98.         1)
  99.                 # the integer part
  100.                 b=""
  101.                 a=${1%.*}
  102.                 if [ "$a" -gt 0 ]
  103.                 then
  104.                         a=${a#+}
  105.                         prefix

  106.                         while [ $a -ne 0 ]
  107.                         do
  108.                                 b=$[$a%2]$b
  109.                                 a=$[$a/2]
  110.                         done
  111.                 else if [ "$a" -lt 0 ]
  112.                 then
  113.                         a=${a#-}
  114.                         prefix
  115.                        
  116.                         while [ $a -ne 0 ]
  117.                         do
  118.                                 b=$[$a%2]$b
  119.                                 a=$[$a/2]
  120.                         done
  121.                         b="-"$b
  122.                 else if [ "$a" -eq 0 ]
  123.                 then
  124.                         b=${a%%0*}0
  125.                 else
  126.                 d2b_help
  127.                 fi
  128.                 fi
  129.                 fi

  130.                 # the decimal part is 0
  131.                 a=${1#*.}
  132.                 if [ "${a#+}" == "$a" -a "${a#-}" == "$a" ]
  133.                 then
  134.                         b=$b"."
  135.                 else
  136.                         d2b_help
  137.                 fi

  138.                 if [ $a -eq 0 ]
  139.                 then
  140.                         b=$b"0"
  141.                         d2b_output
  142.                 fi

  143.                 # the decimal part is not 0

  144.                         # cut the suffixed 0 of decimal part
  145.                         c=0
  146.                         until [ "$c" = "${#a}" ]
  147.                         do
  148.                                 c=${#a}
  149.                                 a=${a%0}
  150.                         done

  151.                         scale=0
  152.                         prefix

  153.                         while [ $a -ne 0 -a $scale -ne $SCALE ]
  154.                         do
  155.                                 a=$[${a}*2]
  156.                                 if [ ${#a} -gt $c ]
  157.                                 then
  158.                                 b=$b"1"
  159.                                 a=${a#?}
  160.                                 else
  161.                                 b=$b"0"
  162.                                 fi
  163.                                 prefix
  164.                                 let scale=$scale+1
  165.                         done
  166.                 d2b_output
  167.                 ;;
  168.        
  169.         *)
  170.                 d2b_help
  171.                 ;;
  172.         esac
  173.         ;;
  174. esac       
复制代码
 楼主| 发表于 2005-8-28 14:39:26 | 显示全部楼层
今天又运行了一下,发现竟然能够达到900的精度,不知道准不准
10to2.sh -0.12 --scale 900
-0.000111101011100001010001111010111000010100011110101110000101000111101011100001010001111010111000
010100011110101110000101000111101011100001010001111010111000010100011110101110000101000111101011100
001010001111010111000010100011110101110000101000111101011100001010001111010111000010100011110101110
000101000111101011100001010001111010111000010100011110101110000101000111101011100001010001111010111
000010100011110101110000101000111101011100001010001111010111000010100011110101110000101000111101011
100001010001111010111000010100011110101110000101000111101011100001010001111010111000010100011110101
110000101000111101011100001010001111010111000010100011110101110000101000111101011100001010001111010
111000010100011110101110000101000111101011100001010001111010111000010100011110101110000101000111101
011100001010001111010111000010100011110101110000101000111101011100001010001111010111000010100011110
101110000101
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表