最近在备考软考的软件设计师考试,在学习过程遇到很多于计算机根底计算相干的知识点,正好最近在学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
- 欢送各位大佬斧正