#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;
}