整个实例都在艾这里,注释齐全,欢迎同行指正,补充
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;
}
}
}