这篇“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
}
版权声明:除特别声明外,本站所有文章皆是本站原创,转载请以超链接形式注明出处!