网络编程
位置:首页>> 网络编程>> Go语言>> Go语言实现二进制与十进制互转的示例代码

Go语言实现二进制与十进制互转的示例代码

作者:往之不谏  发布时间:2024-02-08 09:31:15 

标签:Go语言,二进制,十进制

最近在备考软考的软件设计师考试,在学习过程遇到很多于计算机基础计算相关的知识点,正好最近在学Go语言,所以就把计算的方式用Go语言实现一下。
当前还在学习过程中,如有问题,欢迎大佬们指正

二进制转十进制

/*
  转换规则:   11001 从末尾到开头,以2为底数,从0开始递增为指数 * 二进制数,然后将这些二进制数相加即可得出10进制数
   11001 = 1 * 2^0  + 0 * 2^1  + 0 * 2^2  + 1 * 2^3  + 1 * 2^4   =  1 + 0 + 0 + 8 + 16 = 25
   这个规则也适用于其他进制转换为十进制,只需要把底数替换为相应的进制数即可,这种方法叫做  “按权展开法"

注意:    二进制数也有小数点,区别是小数点左边的指数为正数,右边的指数为负数
   例如:    11.01 =  1 * 2^-2   + 0 * 2^-1 +  1 * 2^0  + 1 * 2^1  = 0.25 + 0 + 1 + 2 = 3.25
*/
func binaryToDecimal(val string) string  {
   // 获取二进制字符字符串
   // 使用前可使用正则校验    [0-1]|[0-1].[0-1]
   var text = val
   // 指数 v1
   var v1 float64 = 0
   var  len  =  len(text)
   // 查看是否包含小数点
   contains := strings.Contains(text, ".")
   if contains {
       index := strings.LastIndex(text, ".")
       if index == (len -1) {
           text = text[0 : len-1]
       } else {
           v3  :=len - index
           v3--
           v1 = float64(0 - v3)
       }
   }
   fmt.Println(v1)
   // 结果
   var result float64
   for i := len -1; i >= 0; i-- {
       u := string(text[i])
       if u == "." {
           continue
       }
       v2,error := strconv.ParseFloat(u, 64)
       if error != nil {
           fmt.Println("转换失败",error)
       }
       // 乘数
       pow := math.Pow(2, v1)
       // 数值累加
       result = result + (v2 * pow)
       // 指数递增
       v1++
   }
   // 这里有个BUG,未判断得出的十进制数小数点后面有几位小数
   return strconv.FormatInt(int64(result), 10)
}

十进制转二进制

/*
  十进制转 二进制的方法  十进制数除以2取余数法
*/
func  decimalToBinary(val string) string  {
   number, err := strconv.ParseInt(val, 10, 64)
   if err != nil {
       fmt.Println("数字转换失败",err)
       return ""
   }

// 查看数字是否是负数
   var bool  = number < 0

if bool {
       number = 0 -number
   }

var result  = ""
   for true {
       if number == 1 {
           result = fmt.Sprint(result,number)
           break
       }
       //// 除数
       var v1 = number / 2
       //// 余数
       var v2 = number % 2
       // 取余数,拼接二进制数
       result = fmt.Sprint(result,v2)
       number = v1
   }

// 反转字符串
   var finalResult  = ""
   var len = len(result)
   for i := len - 1; i >= 0; i-- {
       finalResult = fmt.Sprint(finalResult,string(result[i]))
   }
   // 如果是负数,则增加符号
   if bool {
       finalResult = fmt.Sprint("-",finalResult)
   }
   return finalResult
}

总结

  • R进制转十进制数的方法叫做按权展开法,这个权指的是指数

  • 指数在小数点右边为负数,左边为正数 例如 二进制数 "1110.01" 的指数依次为 -2 -1 0 1 2 3

来源:https://segmentfault.com/a/1190000043744317

0
投稿

猜你喜欢

手机版 网络编程 asp之家 www.aspxhome.com