【Golang】二进制字符串转换为数字

 在本文中,我们将探讨如何使用 Go 语言将十六进制字符串转换为二进制字符串,将不定长整型补码字符串转换为数字,以及如何将 IEEE754 标准的单精度(32位)和双精度(64位)浮点数字符串转换为数字。最后,我们将讨论如何将布尔类型的二进制字符串转换为布尔值。

    • 十六进制字符串转二进制字符串
    • 不定长整型补码字符串转数字
    • IEEE754 标准浮点数字符串转数字
      • 单精度浮点数
      • 双精度浮点数
    • 布尔类型字符串转布尔类型
    • 测试
      • 测试结果

十六进制字符串转二进制字符串

package compute
import ("errors""strconv""strings"
)
// HexToBinary 将十六进制字符串转换为二进制字符串。
func HexToBinary(hex string) (string, error) {decimal, err := strconv.ParseInt(hex, 16, 64)if err != nil {return "", err}// 使用 strconv.FormatInt 把整数转换为二进制字符串。binaryStr := strconv.FormatInt(decimal, 2)// 计算需要补充的0的个数。diff := len(hex)*4 - len(binaryStr) // 补全至正确的长度。return strings.Repeat("0", diff) + binaryStr, nil
}

这段代码首先定义了一个函数 HexToBinary,它接受一个十六进制字符串,并返回相应的二进制字符串。它使用 strconv.ParseInt 函数将十六进制字符串转换为整数,然后用 strconv.FormatInt 转换为二进制字符串。如果输入的字符串不能正确转换,函数将返回一个错误。<链接>

不定长整型补码字符串转数字

package compute
import ("errors""math""strconv"
)
// BinaryIntegerStringToInt 将不定长整型补码字符串转换为数字。
func BinaryIntegerStringToInt(binaryStr string) (num int64, err error) {// 解析二进制补码字符串为整数。num, err = strconv.ParseInt(binaryStr, 2, 64)if err != nil {return}// 如果最高位是1,则表示这是一个负数,需要进行补码转换。if binaryStr[:1] == "1" {num -= int64(math.Pow(2, float64(len(binaryStr))))}return
}

这个函数 BinaryIntegerStringToInt 用于将不定长的二进制补码字符串转换为整数。如果最高位是1,则表示这是一个负数,需要从结果中减去 2^len(binaryStr) 以得到实际的数值。<链接>

IEEE754 标准浮点数字符串转数字

单精度浮点数

package compute
import ("errors""math""strconv"
)
// BinaryFloatStringToFloat 将IEEE754标准单精度浮点数字符串转为数字。
func BinaryFloatStringToFloat(binaryStr string) (float64, error) {// 确保字符串长度为32位。n := 32 - len(binaryStr)if n >= 0 && n < 32 {binaryStr = strings.Repeat("0", n) + binaryStr} else {return 0, errors.New("unsupported binary length")}// 解析符号位。sign := 1.0if binaryStr[0] == '1' {sign = -1.0}// 解析指数位。exponent, _ := strconv.ParseInt(binaryStr[1:9], 2, 64)exponent -= 127// 解析尾数位。mantissa := float64(0)for i := 9; i < len(binaryStr); i++ {if binaryStr[i] == '1' {mantissa += 1 / (math.Pow(2, float64(i-8)))}}// 计算浮点数值。result := sign * (1 + mantissa) * (math.Pow(2, float64(exponent)))return result, nil
}

这段代码定义了一个函数 BinaryFloatStringToFloat,它将单精度浮点数的二进制字符串转换为 float64 类型的数字。它首先检查字符串的长度是否为32位,如果不是,则补足至32位。然后,它解析符号位、指数位和尾数位,并计算出最终的浮点数值。<链接>

双精度浮点数

package compute
import ("errors""math""strconv"
)
// BinaryDoubleStringToFloat 将IEEE754标准双精度浮点数字符串转为数字。
func BinaryDoubleStringToFloat(binaryStr string) (float64, error) {// 确保字符串长度为64位。n := 64 - len(binaryStr)if n >= 0 && n < 64 {binaryStr = strings.Repeat("0", n) + binaryStr} else {return 0, errors.New("unsupported binary length")}// 解析符号位。sign := 1.0if binaryStr[0] == '1' {sign = -1.0}// 解析指数位。exponent, _ := strconv.ParseInt(binaryStr[1:12], 2, 64)exponent -= 1023// 解析尾数位。mantissa := float64(0)for i := 12; i < len(binaryStr); i++ {if binaryStr[i] == '1' {mantissa += 1 / float64(math.Pow(2, float64(i-11)))}}// 计算浮点数值。result := sign * (1 + mantissa) * math.Pow(2, float64(exponent))return result, nil
}

这段代码定义了一个函数 BinaryDoubleStringToFloat,它将双精度浮点数的二进制字符串转换为 float64 类型的数字。它的处理过程与单精度浮点数的转换类似,只是字符串的长度要求是64位,并且指数位的偏移量不同。<链接>

布尔类型字符串转布尔类型

package compute
import "strings"
// BinaryBooleanStringToBoolean 将布尔类型的二进制字符串转换为布尔值。
func BinaryBooleanStringToBoolean(binaryStr string) bool {return binaryStr == "1"
}

这个函数 BinaryBooleanStringToBoolean 接受一个二进制字符串,并返回对应的布尔值。如果字符串为 “1”,则返回 true;如果为其他任何字符,则返回 false

测试

func main() {hexString := "0f6561f02f1505"binaryString, _ := HexToBinary(hexString)fmt.Printf("十六进制字符串:%s\n二进制字符串:%s\n\n", hexString, binaryString)binaryString = "10110100101"resultInt, _ := BinaryIntegerStringToInt(binaryString)fmt.Printf("二进制字符串:%s\n转换结果:%d\n\n", binaryString, resultInt)binaryString = "11000001010010000000000000000000"result, _ := BinaryFloatStringToFloat(binaryString)fmt.Printf("二进制字符串:%s\n转换结果:%.2f\n\n", binaryString, result)binaryString = "0100000000101001100100011010000000000000000000000000000000000000"result, _ = BinaryDoubleStringToFloat(binaryString)fmt.Printf("二进制字符串:%s\n转换结果:%.5f\n\n", binaryString, result)fmt.Printf("二进制字符串:%s\n转换结果:%t\n\n", "0", BinaryBooleanStringToBoolean("0"))
}

测试结果

在这里插入图片描述

 以上函数展示了如何使用 Go 语言进行不同类型数字和布尔值的转换。在实际应用中,这些函数可以作为处理二进制数据的工具,例如在解析网络数据包、处理计算机架构相关的数据或者在算法中需要进行数值计算时。确保在实际使用这些函数时,输入参数符合预期,以避免可能的运行时错误。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/625445.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python案例单进程与多进程,传参

1.单进程 import timedef run1():print(我是run函数)# 当前代码阻塞在这了 卡在这了time.sleep(1000)def run2():print(我是run函数)# 当前代码阻塞在这了 卡在这了time.sleep(1000) run1() run2() print(我是下面的代码) 2.多进程 import time from multiprocessing impo…

商业世界,从2023到2024

作者&#xff5c;潮汐商业评论 编辑&#xff5c;Ray 变化总在发生&#xff0c;你不去迎接进步的变化&#xff0c;就会等到退步的变化。 —— 查理.芒格 2023, 我们似乎总在不断告别。从“一生自由”的大家黄永玉到“智慧”投资家查理.芒格&#xff0c;再到写出《不能承受的生命…

历史更新记录 - DarkVoxel Wiki

V2.0.1.7 正在开发中 按Home键返回顶部&#xff0c;按End键跳转至底部 [首页] V2.0.1.6 1.添加了实体&#xff1a;火箭弹I、火箭弹II、火箭弹III、火箭弹IV、丛林史莱姆、丛林僵尸、冰雪史莱姆 2.添加了物品: 火箭炮、火箭弹I、火箭弹II、火箭弹III、火箭弹IV、沙岩、沙漠化石、…

Zung氏抑郁自评量表SDS

抑郁症是常见的心理障碍&#xff0c;其症状表现为&#xff1a;心境低落、思维迟缓、意志活动减退、认知功能损害、躯体症状等。在生活中常有悲观消沉&#xff0c;灰心丧气&#xff0c;对所有事情都提不起兴趣&#xff0c;严重的还会出现肢体僵硬和耳鸣等症状。 部分人有明显的…

生成对抗网络GAN简介- 图像处理应用

GAN是一种由两部分组成的神经网络架构&#xff0c;通常用于生成逼真的图像。这两部分是生成器&#xff08;Generator&#xff09;和判别器&#xff08;Discriminator&#xff09;。 生成器&#xff08;Generator&#xff09;&#xff1a;它的目标是创建逼真的图像。这些图像是从…

10分钟快速上手LLM大模型Python前端开发(三)之显示模块(一)

10分钟快速上手LLM大模型Python前端开发&#xff08;三&#xff09;之显示模块&#xff08;一&#xff09; 显示代码初步测试 通用显示方法显示字符串显示dataframe显示Markdown 微信公众号&#xff1a;leetcode_algos_life&#xff0c;代码随想随记 小红书&#xff1a;4124081…

Linux网络文件共享服务

目录 一.文件存储类型 1.直连式存储&#xff1a;Direct-Attached Storage&#xff0c;简称DAS 2.存储区域网络&#xff1a;Storage Area Network&#xff0c;简称SAN&#xff08;可以使用空间&#xff0c;管理也是你来管理&#xff09; 3.网络附加存储&#xff1a;Network-…

运筹说 第67期 | 动态规划模型的建立与求解

通过前一期的学习&#xff0c;我们已经学会了动态规划的基本概念和基本原理。本期小编带大家学习动态规划模型的建立与求解。 动态规划模型的建立 一 概述 建立动态规划的模型&#xff0c;就是分析问题并建立问题的动态规划基本方程。 成功地应用动态规划方法的关键&#x…

Laravel 框架中队列的使用

概述 Laravel 框架内置了强大的队列系统&#xff0c;用于处理异步任务、提高系统性能等。队列可以让任务异步执行&#xff0c;而不会阻塞当前进程&#xff0c;可以提高系统的处理能力。 Laravel 的队列系统支持多种驱动&#xff0c;如 Redis、Beanstalkd、SQS 等&#xff0c;…

备案(三)

首次备案需要多少天 备案初审&#xff1a;您提交初审后&#xff0c;天翼云会在一个工作日内进行审核&#xff0c;并通过短信和邮件形式通知审核结果。 管局审核&#xff1a;各地通管局审核时间不同&#xff0c;一般为1到20个工作日&#xff0c;审核结果将以短信和邮件形式通知…

(Java企业 / 公司项目)JMeter接口压测使用(保姆式手把手教会)

一. JMeter简介认识&#xff08;重点是下面的使用方法&#xff09; JMeter是一个开源的Java应用程序&#xff0c;由Apache软件基金会开发和维护&#xff0c;可用于性能测试、压力测试、接口测试等。 1. 原理 JMeter的基本原理是模拟多用户并发访问应用程序&#xff0c;通过发…

Stable Diffusion 提示词解析|AI绘画

概述 玩了很久的SD&#xff0c;感觉已经没有一开始的激情了&#xff0c;最近有幸看到了几篇关于提示词的指导文章&#xff0c;突然感觉又发现了新大陆&#xff0c;整理后供大家一起学习。 好的提示词应该包含如下几个模块&#xff1a; Anatomy of a good prompt解析好的提示…

C++中的符号->

在C中&#xff0c;符号“->”用于访问指向对象的指针的成员。它也被称为箭头运算符或取消引用运算符。 使用“->”符号的基本语法是&#xff1a; 对象指针->成员名称 这里&#xff0c;object_pointer是指向对象的指针&#xff0c;member_name是属于该对象的成员变量…

多目标优化(Python):多目标粒子群优化算法(MOPSO)求解ZDT1、ZDT2、ZDT3、ZDT4、ZDT6(提供Python代码)

一、多目标粒子群优化算法 多目标粒子群优化算法&#xff08;MOPSO&#xff09;是一种用于解决多目标优化问题的进化算法。它基于粒子群优化算法&#xff08;PSO&#xff09;&#xff0c;通过引入多个目标函数和非支配排序来处理多目标问题。 MOPSO的基本思想是将问题转化为在…

spring security @EnableWebSecurity自动配置DaoAuthenticationProvider流程

版本 spring-security:6.2.1 满足下列情况时&#xff0c;spring-security会自动配置DaoAuthenticationProvider 使用EnableWebSecurity注册UserDetailsServiceBean没有注册其他AuthenticationProvider类型的Bean没有通过http.authenticationProvider配置 源码 org.springf…

操作说明 - DarkVoxel Wiki

[首页] DarkVoxel &#xff08;第二版&#xff09; 操作说明 基本操作 AWSD: 移动玩家 0~9: 快捷栏物品选择 J: 使用当前物品 方块上左键&#xff1a;镐/斧挖掘方块/砍树 K: 操作面前方块 方块上右键&#xff1a;操作方块 Backspace: 丢弃一个物品 物品上左键&#x…

C#,字符串匹配(模式搜索)AC(Aho Corasick)算法的源代码

Aho-Corasick算法简称AC算法&#xff0c;也称为AC自动机(Aho-Corasick)算法&#xff0c;1975年产生于贝尔实验室&#xff08;The Bell Labs&#xff09;&#xff0c;是一种用于解决多模式字符串匹配的经典算法之一。 the Bell Lab 本文的运行效果&#xff1a; AC算法以模式树…

Posgresql macOS安装和基础操作

摘要 本文介绍macOS版本Postgresql的安装&#xff0c;pg常用命令。作为笔记记录&#xff0c;后续方便查看。 Postgresql安装 官网下载postgresql安装包https://www.postgresql.org/download/。官网下载慢时&#xff0c;可以从这里下载我上传的mac版本的pg安装包资源。下载后&am…

Python装饰器重载内置操作

1 Python装饰器重载内置操作 python2.x的新式类和python3.x的全部类&#xff0c;内置操作表达式调用&#xff0c;不会触发__getattr__()和__getattribute__()。参考《python的getattr和getattribute拦截内置操作》。 NO内置操作表达式(隐式调用)对应方法(显式调用)1索引操作[…

深度学习记录--Train/dev/test sets

为什么需要训练集、验证集(简单交叉验证集)和测试集&#xff1f; 为了创建高效的神经网络&#xff0c;需要不断进行训练(迭代) 一个神经网络的产生 从最开始的想法idea开始&#xff0c;然后付诸于代码code&#xff0c;根据结果验证反过来对一开始的想法idea进行修正&#xf…