#include<iostream>
#include<vector>
#include"math.h"
#include<iomanip>

using namespace std;

void fun(bool m)//打印 
{
	cout<<m;
}
vector<bool> get_hex_2b(unsigned int a)//将十六进制转化成二进制 
{
	vector<bool> x; 
	for (int i=0;i<32;i++)
	{
		if((((int)a)&(0x80000000>>i)))
		{
			x.push_back(1);
		}
		else
		{
			x.push_back(0);
		}
	}
	///////////////////////////////////打印十六进制的二进制码 
	cout<<"二进制码:"<<endl;
	for_each(x.begin(),x.end(),fun);
	cout<<endl;
	/////////////////////////////////////
	return x;
}
int get_hex_jiema(vector<bool> a)//参数为短浮点数的二进制码 
{
	//将原来的二进制码的1-8位装到移码容器中
	vector<bool> yima(a.begin()+1,a.begin()+9);	
	 
	vector<bool>::iterator ite=yima.begin();//设置容器的迭代器 
	unsigned int sum=0;
	//计算二进制代码表示的十进制数 
	for(int i=0;i<8;i++)
	{
		sum=sum+(*ite)*pow(2,7-i);
		ite++;
	}
	int jiema=sum-127;
	return jiema;
}
float get_10dec(vector<bool> a)//参数为短浮点数的二进制码 
{
	//存整数部分的二进制 ,初始值中有一个1,为尾码的隐含位 
	vector<bool> zhengshu(1,1);
	
	vector<bool> xiaoshu;//存小数部分的二进制
	
	 //将原本的二进制代码的9-尾位装到尾码容器中
	vector<bool> weima(a.begin()+9,a.end()); 
	
	//根据阶码大小,向左移位尾码,得到整数的二进制代码 
	zhengshu.insert(zhengshu.end(),weima.begin(),weima.begin()+get_hex_jiema(a));
	
	//尾码的剩余部分为小数的二进制代码 
	xiaoshu.insert(xiaoshu.end(),weima.begin()+get_hex_jiema(a),weima.end());
	//////////////////////////////////////////
	
	//打印整数和小数部分的二进制码 
	cout<<"整数部分:"<<endl;
	for_each(zhengshu.begin(),zhengshu.end(),fun);
	cout<<endl;
	cout<<"小数部分:"<<endl;
	for_each(xiaoshu.begin(),xiaoshu.end(),fun);
	cout<<endl;
	/////////////////////////////////////////////
	float zheng_shu=0;
	float xiao_shu=0;
	float sum=0;
	
	//计算整数的十进制大小 
	for(int i=zhengshu.size();i>0;i--)
	{
		zheng_shu=zheng_shu+zhengshu[i-1]*pow(2,zhengshu.size()-i);
	}
	
	//计算小数的十进制大小 
	for(int i=0;i<xiaoshu.size();i++)
	{
		xiao_shu=xiao_shu+xiaoshu[i]*pow(2,-(i+1));
	}
	sum=zheng_shu+xiao_shu;
	
	//判断符号位 
	if(a[0]==1)
		sum=0-sum; 
		
	return sum;
} 
int main()
{
	unsigned int a;
	float sum=0;
	int e=0;
	cout<<"请输入要转化成是十进制的IEEE754标准的短浮点数的十六进制形式:" <<endl; 
	cin>>hex>>a;//十六进制输入
	e= get_hex_jiema(get_hex_2b(a));
	cout<<"阶码的大小:"<<e<<endl; 
	sum=get_10dec(get_hex_2b(a));
	cout<<"转换成十进制数为:"<<endl;
	cout<<sum<<endl;
	cout<<endl;
	system("pause");
	return 0;
}