Go语言实现二进制与十进制互转代码示例
本文介绍如何在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语言基础运算与进制转换的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













