Go语言 - 二进制数转十进制数

发布时间 2023-05-02 16:47:41作者: 往之不谏,来之可追

二进制转10进制的方法

最近在备考软考的软件设计师考试,在学习过程遇到很多于计算机基础计算相关的知识点,正好最近在学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)
}

总结

  • R进制转十进制数的方法叫做按权展开法,这个权指的是指数
  • 指数在小数点右边为负数,左边为正数 例如 二进制数 "1110.01" 的指数依次为 -2 -1 0 1 2 3