C#中将32位二进制转换为float【Real】十进制类型

news2024/11/20 9:23:33

已知一个32位二进制字符串,转换为float【Real】十进制。

参考本人一篇博客 float数转二进制

C#关于32位浮点数Float(Real)一步步按位Bit进行解析_real32位浮点数_斯内科的博客-CSDN博客

 现在是32位二进制转化为十进制浮点数,C#有直接转换的方法类BitConverter:

使用四个字节【32位二进制】数组即可转化为一个float【Real】数字,代码如下:

float number = BitConverter.ToSingle(new byte[] { 12, 34, 56, 78 }, 0);

IEEE基础知识:

浮点数的32位N=1符号位(Sign)+8指数位(Exponent)+23尾数部分(Mantissa)

符号位(Sign) : 0代表正,1代表为负【占1位】
指数位(Exponent)::用于存储科学计数法中的指数数据,并且采用移位存储【占8位】
尾数部分(Mantissa):尾数部分【占23位】
单精度float:N共32位,其中S占1位,E占8位,M占23位。因此小数点后最多精确到23/4=6位 。

IEEE规则:二进制32位转换为float【Real】规则


第一位为1代表负数,第一位为0代表正数或者0
第二位到第九位代表 指数位,对应的值减去127就是移位数【shiftCount】
【第十位开始】尾数23位前面加一个1,凑够24位,这个24位尾数的前【shiftCount+1】个数就是整数部分,剩下的就是小数部分

整数二进制转为10进制:从低位到高位分别是2的0次幂、1次幂、2次幂……,分别相乘再相加,得到的和即为10进制结果。

小数部分的二进制转换位10进制:与整数部分类似,从小数点开始分别是2的-1次幂、-2次幂、-3次幂……,分别相乘再相加,得到的和即为10进制结果

因为C#是低字节在前的【BitConverter.IsLittleEndian为True】,我们需将四个字节 倒置

新建控制台应用程序:BinaryToFloatDemo,测试源程序如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace BinaryToFloatDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.SetWindowSize(160, 20);
            //单精度浮点数对应32位
            //符号位(Sign) : 0代表正,1代表为负【占1位】
            //指数位(Exponent):用于存储科学计数法中的指数数据,并且采用移位存储【占8位】
            //尾数部分(Mantissa):尾数部分【占23位】
            //单精度float:N共32位,其中S占1位,E占8位,M占23位。因此小数点后最多精确到23/4=6位 
            //双精度double:N共32位,其中S占1位,E占11位,M占52位。因此小数点后最多精确到52/4=13位 

            //IEEE规则:二进制32位转float【Real】规则
            //第一位为1代表负数,第一位为0代表正数或者0
            //第二位到第九位代表 指数位,对应的值减去127就是移位数【shiftCount】
            //【第十位开始】尾数23位前面加一个1,凑够24位,这个24位尾数的前【shiftCount+1】个数就是整数部分,剩下的就是小数部分

            //整数二进制转为10进制:从低位到高位分别是2的0次幂、1次幂、2次幂……,分别相乘再相加,得到的和即为10进制结果。
            //小数部分的二进制转换位10进制:与整数部分类似,从小数点开始分别是2的-1次幂、-2次幂、-3次幂……,分别相乘再相加,得到的和即为10进制结果,比如001(2进制)对应0.125(10进制)
            
            byte[] binaryArraySource = new byte[4] { 80, 32, 241, 71 };
            byte[] binaryArray = binaryArraySource.Reverse().ToArray();
            Console.WriteLine($"将数组顺序反转,反转后为【{string.Join(",", binaryArray)}】");
            IEnumerable<string> binaryCollection = binaryArray.Select(element => Convert.ToString(element, 2).PadLeft(8, '0'));
            string binaryString = string.Join("", binaryCollection);
            Console.WriteLine($"转化为32位二进制,为【{string.Join("\x20", binaryCollection)}】");
            string signString = (binaryString[0] == '1' ? "-" : "+");
            Console.WriteLine($"符号位占用1位,为【{signString}】");
            string exponent = binaryString.Substring(1, 8);
            int shiftCount = Convert.ToByte(exponent, 2) - 127;
            Console.WriteLine($"指数位为8位【{exponent}】,对应数字【{Convert.ToByte(exponent, 2)}】,共移动【{shiftCount}】位");
            string mantissa = binaryString.Substring(9);
            string dotString = $"1.{mantissa}";
            Console.WriteLine($"尾数位为23位【{mantissa}】,尾数位前面添加一个1并插入移位小数点,字符串为【{dotString}乘以2的{shiftCount}次方】");
            dotString = dotString.Replace(".", "").Insert(shiftCount+1, ".");
            Console.WriteLine($"即【{dotString}】");
            string integerPart = dotString.Substring(0, shiftCount + 1);//整数部分
            string fractionalPart = dotString.Substring(shiftCount + 2);//小数部分

            //整数部分:从低位到高位 依次是2的0次方,2个1次方,2的2次方,然后累加
            int numberInteger = 0;
            for (int i = 0; i < integerPart.Length; i++)
            {
                if (integerPart[i] == '1') 
                {
                    numberInteger += (1 << (integerPart.Length - 1 - i));
                }
            }
            //小数部分:从小数点开始分别是2的-1次幂、-2次幂、-3次幂……
            double numberFractional = 0D;
            for (int i = 0; i < fractionalPart.Length; i++)
            {
                if (fractionalPart[i] == '1')
                {
                    numberFractional += Math.Pow(2, -1 - i);
                }
            }
            Console.WriteLine($"整数部分【{integerPart}】,对应整数字【{numberInteger}】.或者使用Convert,整数也为【{Convert.ToInt32(integerPart, 2)}】");
            Console.WriteLine($"小数部分【{fractionalPart}】,对应小数【{numberFractional}】");
            string destNumber = $"{signString}{numberInteger + numberFractional}";
            Console.WriteLine($"32位二进制对应的浮点数为【{destNumber}】,使用BitConverter转换为浮点数的结果为【{BitConverter.ToSingle(binaryArraySource, 0)}】");
            
            Console.ReadLine(); 
        }
    }
}

测试如图:

【注意:浮点数有精度限制】

 

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

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

相关文章

电动汽车入网技术(V2G)调度优化(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f468;‍&#x1f4bb;4 Matlab代码 &#x1f4a5;1 概述 近年来我国电动汽车行业飞速发展&#xff0c;其中电动汽车入网技术&#xff08;vehicle-to-grid&#xff0c;V2G&#xff09;在…

RapidScada Linux安装教程

官方安装步骤&#xff1a;在 Linux上安装 - Rapid SCADA,安装过程中遇到一些坑&#xff0c;记录详细步骤。 官方推荐的Ubuntu&#xff0c;未测试Centos 1. 安装ASP.Net运行环境&#xff08;Runtime&#xff09; 下载地址&#xff1a;下载 .NET 6.0 (Linux、macOS 和 Windows)&a…

selenium还能这么玩:连接已经存在的浏览器

测试和爬虫对selenium并不会陌生&#xff0c;现有的教程已经非常多。但是因为 selenium 封装的方法比较底层&#xff0c;所以灵活性非常高&#xff0c;我们可以基于这种灵活性来实现非常丰富的定制功能。 这篇文章介绍一个操作&#xff0c;可以让 selenium 连接我们手动打开的…

AI绘画-Midjourney基础2-超强二次元风格模型 niji 5

niji 模型是 mj 的一种模型,可以生成二次元风格的图片。 在控制台输入 /settings 指令,进入设置页面。 选择第二行的 Niji version 5 模型,就可以创作二次元风格的图片了! 一、expressive 风格 expressive 风格是 niji 5 模型的默认风格。 Step into the world :: of a …

14个最佳创业企业WordPress主题

要创建免费网站&#xff1f;从易服客建站平台免费开始 500M免费空间&#xff0c;可升级为20GB电子商务网站 创建免费网站 您网站的设计使您能够展示产品的独特卖点。通过正确的主题&#xff0c;您将能够解释为什么客户应该选择您的品牌而不是其他品牌。 在本文中&#xff0…

信息(文档)和配置管理

信息&#xff08;文档&#xff09; 配置管理 小改动增加Y的值&#xff0c;大改动增加X的值 配置控制

jRebel实现热部署以及云热部署

idea使用jRebel教程很多&#xff0c;不再累述 服务器部署jRebel 1.下载激活工具(github&#xff0c;别忘了加速)&#xff1a;下载链接 因为是linux&#xff0c;固下载下方资源 放进服务器执行下方命令运行&#xff0c;port就是端口号&#xff0c;看着改&#xff0c;我用的888…

什么是GHZ?炫云到底是怎么收费的?

作为一家云渲染“老牌”服务商&#xff0c;炫云的行业资历无疑是悠久的。在广大用户的支持与认可下&#xff0c;炫云砥砺前行迎来蓬勃发展。注册用户体量的剧增&#xff0c;为炫云带来了更多新面孔。在客服汇总的新用户常见问题里&#xff0c;有关“GHZ”与“收费”的字眼出现频…

Hyperf使用WebSocket 服务

1.安装服务 composer require hyperf/websocket-server2.配置 Server 修改 config/autoload/server.php&#xff0c;增加以下配置。 <?phpdeclare(strict_types1); /*** This file is part of Hyperf.** link https://www.hyperf.io* document https://hyperf.wiki*…

ChatGpt使用、小白上手指南,整理5个ChatGpt学习文库和平台

ChatGpt目前很火&#xff0c;话题度很高&#xff0c;关于它的账号售卖、视频课程网上遍地都是&#xff0c;尝试没有窍门&#xff0c;学习付费太高&#xff0c;一不小心就会被割韭菜。 闲暇之余也从网上搜集整理了5个平台&#xff0c;里面系统的介绍了有关ChatGpt的应用和相关&…

IM即时通讯系统[SpringBoot+Netty]——梳理(五)

文章目录 十一、打造QQ在线状态功能之为你的应用增添色彩1、在线状态设计2、Netty网关用户状态变更通知、登录ack3、逻辑层处理用户上线下线4、在线状态订阅—临时订阅5、实现手动设置客户端状态接口6、推拉结合实现在线状态更新 十二、IM扩展—能做的事情还有很多1、如何让陌生…

​ NISP一级备考知识总结之信息安全概述、信息安全基础

参加每年的大学生网络安全精英赛通过初赛就可以嫖一张 nisp&#xff08;国家信息安全水平考试&#xff09; 一级证书&#xff0c;nisp 一级本身没啥考的价值&#xff0c;能白嫖自然很香 1.信息安全概述 信息与信息技术 信息概述 信息奠基人香农认为&#xff1a;信息是用来消…

ChatGPT插件:让你的 ChatGPT 与众不同!

这个 Chrome 浏览器插件是作者觉得原本的 ChatGPT 界面不太丰富&#xff0c;然后想着自己写一个插件把它变得更加好看一点 &#x1f92a;&#xff0c;因此把这个插件取名为 ChatGPT-theme&#xff0c;目前插件已经发布了是 1.0.1 版本的&#xff0c;因为 1.0.0 作者测了一下有些…

水电站泄洪监测预警系统解决方案

一、方案背景 每到汛期水库或电站泄洪时&#xff0c;下游各责任单位接到泄洪通知后&#xff0c;组织人员对下游河道进行巡查&#xff0c;耗费大量的人力物力&#xff0c;且信息传递效果不明显。巡查办法老套单一&#xff0c;信息传递速度慢、覆盖范围小&#xff0c; 无法让沿途…

【软考备战·四月模考】希赛网四月模考软件设计师上午题

文章目录 一、成绩报告二、错题总结第一题第二题第三题第四题第五题第六题第七题第八题第九题第十题第十一题第十二题第十三题第十四题第十五题第十六题第十七题第十八题第十九题第二十题第二十一题第二十二题 三、知识查缺 题目及解析来源&#xff1a;2023上半年软考-模考大赛…

【Linux Network】传输层协议——TCP

目录 TCP协议 TCP协议段格式 确认应答(ACK)机制 超时重传机制 连接管理机制 理解TIME_WAIT状态 解决TIME_WAIT状态引起的bind失败的方法 理解 CLOSE_WAIT 状态 滑动窗口 流量控制 拥塞控制 延迟应答 捎带应答 面向字节流 粘包问题 TCP异常情况 TCP小结 基于TCP应用层协议 TCP/U…

torch.nn.Module

它是所有的神经网络的根父类&#xff01; 你的神经网络必然要继承 可以看一下这篇文章

《机器学习》习题 第 4 章

4.1 试证明对于不含冲突数据 (即特征向量完全相同但标记不同) 的训练集, 必存在与训练集一致 (即训练误差为 0)的决策树. 答案&#xff1a; 假设不存在与训练集一致的决策树&#xff0c;那么训练集训练得到的决策树至少有一个节点上存在无法划分的多个数据&#xff08;若节点…

Linux速通 常用基本命令

大部分摘自《Linux 命令行与shell脚本编程大全》该书&#xff0c;少部分参考自csdn博客 目录 一、基本的bash shell 命令 1、文件和目录列表 基本列表功能 修改输出信息 过滤输出列表 2、处理文件 3、处理目录 4、查看文件内容 查看整个文件 查看部分文件 二、更多的…

makefile 学习(1):C/C++ 编译过程

1. GCC 介绍 1.1 介绍 GCC 官方文档 https://gcc.gnu.org/onlinedocs/ 官方文档是最权威的&#xff0c;网上所有的答案都来自官方文档国内论坛参差不齐&#xff0c;找到好的答案比较花时间&#xff0c;并且很容易被错误的文档误导。所以推荐看官方文档靠谱点&#xff0c;并且…