代码分析将double类型的浮点数转换成二进制-实例

整个实例都在艾这里,注释齐全,欢迎同行指正,补充

using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApplication1
{
    class program
    {
        static void Main(string[] args)
        {
            string S, E, M;//分别储存符号位,指数值,尾数
            double num = -1234.5678;//随便定义一个双精度浮点数

            string[] numBinArr = getFloatPartToBin(Math.Abs(num));
            string strINtAndFlo = numBinArr[0] + "." + numBinArr[1];//获得整数部分二进制和小数部分二进制的组合字符串
            int dotPos = strINtAndFlo.IndexOf('.');//小数点位置
            int firstOne = strINtAndFlo.IndexOf('1');//有效1的位置
            int MovCount=(dotPos-firstOne-1);//移动矢量(值可以正负)
            Console.WriteLine(num+"的整数和小数部分组合起来的二进制形式是:\n"+strINtAndFlo);
            Console.WriteLine("小数点的位置是:" + dotPos);
            Console.WriteLine("从左边起第一个有效数字一是:" + firstOne);
            Console.WriteLine("因此,小数点移动的位移矢量值是:" + MovCount);
            //分析出符号位的值
            if (num<0)
            {S = "1"; }
            else
            { S = "0"; }
            Console.WriteLine("S符号位的值是:"+S);
            //分析出E指数的值
            E = Convert.ToString(MovCount + 1023, 2);
            Console.WriteLine("E11位的值是:" + E.PadLeft(11,'0'));
            //得到M
            M = (numBinArr[0] + numBinArr[1]).Substring(1, 52);
            Console.WriteLine("M52位的值是:" + M);
            Console.WriteLine("双精度数[" + num + "]的二进制形式是:\n" + S + E + M );
 
        }      

        /// <summary>
        /// 获取小数部分的二进制形式
        /// </summary>
        /// <param name="num"></param>
        /// <returns></returns>
        public static string[] getFloatPartToBin(double num)
        {
            string FloatBin = "";//保留浮点尾数部分的二进制形式
            string[] numSplit = num.ToString().Split('.');//把双精度浮点数分成整数和小数部分

            string[] returnValue=new string[2];//用来返回整数和小数部分的二进制值
            double fd=double.Parse("0."+numSplit[1]);
            while (fd != 1.0d)
            {
                if (fd * 2 >= 1.0)
                {
                    fd = fd *2- 1.0d;
                    FloatBin += "1";
                }
                else
                {
                    fd = fd * 2;
                    FloatBin += "0";
                }
                
                if (Convert.ToString(long.Parse(numSplit[0]), 2).Length + FloatBin.Length >= 53)
                {
                    break;//如果尾数的位数已经达到了上限,就停止尾数的转换
                }

            }
            returnValue[0]=Convert.ToString(long.Parse( numSplit[0]),2);
            returnValue[1]=FloatBin;
            return returnValue;
        }
   }
    
  }

运行结果

上面的代码在转成数组的时候不太健壮,修改了一下

注意区别,已经注释:

using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApplication1
{
    class program
    {
        static void Main(string[] args)
        {
            string S, E, M;//分别储存符号位,指数值,尾数
            double num =-1d;//随便定义一个双精度浮点数
            string[] numBinArr = getFloatPartToBin(Math.Abs(num));
            string strINtAndFlo = numBinArr[0] + "." + numBinArr[1];//获得整数部分二进制和小数部分二进制的组合字符串
            int dotPos = strINtAndFlo.IndexOf('.');//小数点位置
            int firstOne = strINtAndFlo.IndexOf('1');//有效1的位置
            int MovCount=(dotPos-firstOne-1);//移动矢量(值可以正负)
            Console.WriteLine(num+"的整数和小数部分组合起来的二进制形式是:\n"+strINtAndFlo);
            Console.WriteLine("小数点的位置是:" + dotPos);
            Console.WriteLine("从左边起第一个有效数字一是:" + firstOne);
            Console.WriteLine("因此,小数点移动的位移矢量值是:" + MovCount);
            //分析出符号位的值
            if (num<0)
            {S = "1"; }
            else
            { S = "0"; }
            Console.WriteLine("S符号位的值是:"+S);
            //分析出E指数的值
            E = Convert.ToString(MovCount + 1023, 2);
            Console.WriteLine("E11位的值是:" + E.PadLeft(11,'0'));
            //得到M
            M = (numBinArr[0] + numBinArr[1]).Substring(1, 52);
            Console.WriteLine("M52位的值是:" + M);
            Console.WriteLine("双精度数[" + num + "]的二进制形式是:\n" + S + E + M );
 
        }      

        /// <summary>
        /// 获取小数部分的二进制形式
        /// </summary>
        /// <param name="num"></param>
        /// <returns></returns>
        public static string[] getFloatPartToBin(double num)
        {
            string FloatBin = "";//保留浮点尾数部分的二进制形式
            //Console.WriteLine(Convert.ToString( num));
            string[] numSplit = (num.ToString("f")).Split('.');//把双精度浮点数分成整数和小数部分,格式为f,默认小数两位,否则像1这样的整数就会失去后面的0,千万记住
            
            string[] returnValue=new string[2];//用来返回整数和小数部分的二进制值
            double fd=double.Parse("0."+numSplit[1]);
            while (fd != 1.0d)
            {
                if (fd * 2 >= 1.0)
                {
                    fd = fd *2- 1.0d;
                    FloatBin += "1";
                }
                else
                {
                    fd = fd * 2;
                    FloatBin += "0";
                }
                
                if (Convert.ToString(long.Parse(numSplit[0]), 2).Length + FloatBin.Length >= 53)
                {
                    break;//如果尾数的位数已经达到了上限,就停止尾数的转换
                }

            }
            returnValue[0]=Convert.ToString(long.Parse( numSplit[0]),2);
            returnValue[1]=FloatBin;
            return returnValue;
        }
   }


    
  }



 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值