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

using namespace std;

vector<bool> zhengshu;//存整数部分的二进制 
vector<bool> xiaoshu;//存小数部分的二进制 

vector<bool> get_zhengshu_2b(float a)
{
	vector<bool> x;
	//八位二进制a xxxx xxxx与1000 0000与,得到每位的二进制数 
	for (int i=0;i<8;i++)
	{
		if((((int)a)&(0x80>>i)))
		{
			x.push_back(1);
		}
		else
		{
			x.push_back(0);
		}
	}
	return x;
} 
void get_2b(float a)
{
	//获取整数部分的二进制码
	 float fabs_a=fabs(a);//取绝对值 
	zhengshu=get_zhengshu_2b(fabs_a);
	
	//获取小数部分的二进制码 
	float n=2;   //小数位的阶数取倒数 
	float b=(fabs_a-floor(fabs_a)); 
	
	//每次除以2判断该位是0还是1 
	while(!b==0)
	{
		if((1.0/n)<b) 
		{
		xiaoshu.push_back(1);
		//若为1则b减去该位所对应的十进制小数大小 ,继续判断低一位,直到b=0 
		b=b-(1.0/n);
		}
		else if((1.0/n)>b)
		{
		xiaoshu.push_back(0);
		}
		else if((1.0/n)==b)
		{
			xiaoshu.push_back(1);
			break;
		}
		n=n*2;
	}
}
int get_jiema()  //返回阶码
{
	for(int i=0;i<8;i++)
	{
		if(zhengshu[i]==1)//判断从左边起第一个为1的位置 
		return 7-i;		// 返回阶码大小 
	}
}
vector<bool> get_yima()//得到移码 
{
	int e=get_jiema();
	e=e+127;  //阶码偏移得到移码 
	return get_zhengshu_2b(e);//返回获得的移码的二进制形式 
}
vector<bool> get_weima()//获得尾码 
{
	vector <bool> m;
	//小数的二进制前插入规格化的码得到尾码 
	xiaoshu.insert(xiaoshu.begin(),zhengshu.begin()+(8-get_jiema()),zhengshu.end());  
	m=xiaoshu;
	return m;
}
vector<bool> to_IEEE754(float x)
{
	vector<bool> IEEE;
	get_2b(x);   //得到x的二进制码 
	//输出原数的二进制形式 
	cout<<"绝对值的二进制数为:"<<endl;
	for(int i=0;i<zhengshu.size();i++)
	{
		cout<<zhengshu[i];
	}
	cout<<".";
	for(int i=0;i<xiaoshu.size();i++)
	{
		cout<<xiaoshu[i];
	}
	cout<<endl;
	//输出移码 
	cout<<"移码为:"<<endl; 
	vector<bool> E=get_yima();
	for(int i=0;i<8;i++)
	{
		cout<<E[i];
	}
	cout<<endl; 
	//组合成短浮点数代码: 
	vector<bool> yima;
	yima=get_yima();
	vector<bool> weima;
	weima=get_weima();
	
	if(x>0)//判断并添加符号位 
	{
		IEEE.insert(IEEE.end(),1,0);
	}
	else
	{
		IEEE.insert(IEEE.end(),1,1);
	}
	IEEE.insert(IEEE.end(),yima.begin(),yima.end());//添加移码 
	IEEE.insert(IEEE.end(),weima.begin(),weima.end());//添加尾码 
	IEEE.insert(IEEE.end(),32-9-weima.size(),0);//尾部补零 共32位 
	return IEEE;
}
void get_hex(vector<bool> E)//得到十六进制显示 
{
	cout<<"0X"; 
	vector<bool>::iterator ite=E.begin();//迭代器 
	int sum=0;
	int n=8;
	while(n--)//八组循环 
	{
		for(int i=0;i<4;i++)//求每4位的十六进制表示 
		{
			sum=sum+(*ite)*pow(2,3-i);//8 4 2 1
			ite++;
		}
		cout<<setiosflags(ios::uppercase)<<hex<<sum;//16进制大写字母输出 
		sum=0;
	}
	cout<<endl;
}
int main()
{
	//////////////求十进制的短浮点数代码////////////////////////////////////// 
	vector<bool> IEEE;
	float x=0;
	cout<<"请输入要转换成IEEE754码的十进制值(要小于256):"<<endl;
	cin>>x;
	IEEE=to_IEEE754(x);
	cout<<"转换成IEEE754标准短浮点数二进制码为:"<<endl;
	for(int i=0;i<IEEE.size();i++)
	{
		
		cout<<IEEE[i];
		if(i==0||i==8)
			cout<<" ";
	}
	cout<<endl;
	cout<<"16进制的代码为:"<<endl; 
	get_hex(IEEE); 
	/////////////////////////////////////////////////////////////////////
	/////////////////求短浮点数代码的十进制?/////////////////////////////
	system("pause");
	return 0;
}