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

月亮慢半拍
月亮慢半拍
发布时间:2026-10-15 | 2人浏览过
原创

本文介绍如何在Go语言中实现二进制与十进制的相互转换,涵盖按权展开法和除2取余法的代码逻辑,包含正负数处理及小数点解析细节。

二进制转十进制

将二进制转换为十进制的核心规则是“按权展开法”。对于整数部分,从右向左(低位到高位)以 2 为底数,指数从 0 开始递增;对于小数部分,从小数点向右,指数从 -1 开始递减。将所有乘积相加即为最终结果。

例如二进制 11001 的转换过程:

  • 1 * 2^4 + 1 * 2^3 + 0 * 2^2 + 0 * 2^1 + 1 * 2^0 = 16 + 8 + 0 + 0 + 1 = 25

若涉及小数,如 11.01:

  • 1 * 2^1 + 1 * 2^0 + 0 * 2^-1 + 1 * 2^-2 = 2 + 1 + 0 + 0.25 = 3.25

第1步:解析二进制字符串并计算总值

在 Go 语言中,可以通过遍历字符串字符并累加的方式实现转换。需注意处理小数点和负指数的情况。

func binaryToDecimal(val string) string {
	var text = val
	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)
		}
	}
	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++
	}
	// 注意:此处直接截断小数可能存在精度丢失或展示不直观问题
	return strconv.FormatInt(int64(result), 10)
}

代码说明与潜在风险:

  • 输入校验:实际使用中建议先通过正则 [0-1]|[0-1]\.[0-1] 校验输入合法性。
  • 小数精度处理 BUG:上述代码最后使用 int64(result) 强制转换,这会直接丢弃小数部分而非四舍五入或保留精度。如果输入包含小数且期望输出精确的小数值,该返回值是不正确的。应根据业务需求返回 float64 或使用 strconv.FormatFloat 保留适当小数位。

十进制转二进制

十进制转二进制通常采用“除 2 取余法”。将整数不断除以 2 记录余数,直到商为 0 或 1,然后将余数逆序排列。负数需先转为正数进行计算,最后补充负号。

第2步:实现除2取余与字符串反转

利用 Go 语言的切片和循环结构,可以简洁地实现这一过程。

func decimalToBinary(val string) string {
	number, err := strconv.ParseInt(val, 10, 64)
	if err != nil {
		fmt.Println("数字转换失败", err)
		return ""
	}
	isNegative := number < 0
	if isNegative {
		number = -number // 转为正数处理
	}
	var result = ""
	for {
		if number == 1 {
			result += fmt.Sprint(number)
			break
		}
		result += fmt.Sprint(number % 2)
		number /= 2
	}
	// 反转字符串
	var finalResult = ""
	for i := len(result) - 1; i >= 0; i-- {
		finalResult += string(result[i])
	}
	if isNegative {
		finalResult = "-" + finalResult
	}
	return finalResult
}

优化建议:

  • 当输入为 0 时,上述逻辑会直接进入反转判断,结果为空字符串,因此建议在入口处增加 if number == 0 { return "0" } 的特判。
  • 字符串拼接在循环中建议使用 strings.Builder 以提升性能。

关键知识点总结

  • 按权展开法:R 进制转十进制,权值即指数。小数点左侧指数为正(从 0 开始递增),右侧为负(从 -1 开始递减)。
  • 负指数示例:二进制 1110.01 各数位对应的指数依次为 -2, -1, 0, 1, 2, 3。
  • 算法互补性:除 2 取余法生成的序列是逆序的,务必通过反转操作得到正确结果。

以上就是Go语言实现二进制与十进制互转的详细内容,更多关于Go语言基础运算与进制转换的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表