接位操作2.
#include <stdio.h>
#include <math.h>
#include <iostream>
using namespace std;
int main()
{
int i,e,E,s,m,x;
float s2=0,n;
bool t;
while(scanf("%X",&x)!=EOF)
{
t=x>>31; //符号位
E=x>>23;
e=(E&255)-127; //译码
m=x&8388607; //尾数
n=m>>(23-e);
n=n+pow(2,e);
//cout<<n<<endl;
for(i=0;i<23-e;i++)
{
s=m&1;
s2=(s2+s)*0.5;
m=m>>1;
}
n=n+s2;
if(t)
cout<<"-"<<n<<endl;
else cout<<n<<endl;
}
return 0;
}
下面这个是 用数组存储的,比较好理解。
#include<iostream>
#include<cstring>
#include<stdio.h>
#include<cstdlib>
#include<cmath>
int a[33];
unsigned int y,x;
using namespace std;
void init()
{
if(x<=0xF)
y=4;
else if(x<=0xFF)
y=8;
else if(x<=0xFFF)
y=12;
else if(x<=0xFFFF)
y=16;
else if(x<=0xFFFFF)
y=20;
else if(x<=0xFFFFFF)
y=24;
else if(x<=0xFFFFFFF)
y=28;
else
y=32;
}
int main()
{
int sum=0;
float t1,sum1,sum2;
int m;
unsigned int temp,t;
while(scanf("%x",&x))
{
t1=1,sum1=0;sum=0,sum2=0;
init();
int i,j;
memset(a,0,sizeof(a));
for(i=0;i<y;i++)
{
temp=x;
temp=temp>>i;
a[32-i]=temp&1;
}
/*
输出二进制位数
*/
for(i=1;i<=32;i++)
cout<<a[i];
cout<<endl;
for(i=9;i>=2;i--)
{
t=1;
for(j=0;j<9-i;j++)
t*=2;
sum+=t*a[i];
}
m=sum-127;//移动的位数
//cout<<m<<endl;
//if(m>0)
sum2=pow(2,m);
for(i=1;i<=9;i++)
a[i]=0;
for(i=0;i<23-m;i++)
{
sum1=(sum1+a[32-i])*0.5;
}
sum1+=sum2;
if(a[1]==1)sum1=-sum1;
cout<<sum1<<endl;
}
return 0;
}
/*
BD400000
10111101010000000000000000000000
0.046875
BD9DE0CB
10111101100111011110000011001011
0.0770889
3C181F9A
00111100000110000001111110011010
0.00928488
*/