位操作 二 移位求二进制

                阅读附件材料,了解IEEE 754浮点数表示标准,写程序解析“BD9D”?

         

#include<iostream>
#include<cstring>
#include<stdio.h>
#include<cstdlib>
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;
	double t1,sum1;
    int m;
    unsigned int temp,t;
    while(scanf("%x",&x))
    {
    t1=1,sum1=0;sum=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;
   }
    return 0;
}
/*
input: 
BD9D
output:
00000000000000001011110110011101
*/

       

             目前C/C++编译器标准都遵照IEEE制定的浮点数表示法来进行float,double运算。这种结构是一种科学计数法,用符号、指数和尾数来表示,底数定为2——即把一个浮点数表示为尾数乘以2的指数次方再添上符号。下面是具体的规格:

 

              符号位阶码 尾数长度
              float 18   23 32
              double  1    11   52 64

          首先看下这个例子:

              (逆向求十进制整数)一个浮点二进制数手工转换成十进制数的例子: 假设浮点二进制数是 1011 1101 0100 0000 0000 0000 0000 0000 1823位分成三段:
             101111010 10000000000000000000000 最后一段是尾数。前面加上"1.", 就是 1.10000000000000000000000 下面确定小数点位置。由E = e-Bias,阶码E01111010,加上00000101才是01111111127), 所以他减去127的偏移量得e=-5。(或者化成十进制得122122-127=-5)。 因此尾数1.10(后面的0不写了)是小数点右移5位的结果。要复原它就要左移5位小数点,得0.0000110, 即十进制的0.046875 。最后是符号:1代表负数,所以最后的结果是 -0.046875 注意:其他机器的浮点数表示方法可能与此不同不能任意移植。

             

#include<iostream>
#include<cstring>
#include<stdio.h>
#include<cstdlib>
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;
	double t1,sum1;
    int m;
    unsigned int temp,t;
    while(scanf("%x",&x))
    {
    t1=1,sum1=0;sum=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)
    a[9]=1;
    if(m<=0)
    {
    	t=-m;
    	t1=1;
    	for(i=1;i<=t;i++)
    	{
    		t1*=0.5;
    	}
    	for(i=9;i<=32;i++)
    	{
    		for(j=9;j<i;j++)
    		{
    		 t1*=0.5;	
    		}
    		sum1+=a[i]*t1;
    	}
    }
    
	
    else if(m>0)
    {
    	for(i=9+m;i>=9;i--)
    {
        t=1;
        for(j=0;j<9+m-i;j++)
        t*=2;
        sum1+=t*a[i];
    }
    for(i=10+m;i<=32;i++)
     {
    	t1=1;
    	for(j=10+m;j<=i;j++)
    	t1*=0.5;
    	sum1+=t1*a[i];
     }
    }
    if(a[1]==1)sum1=-sum1;
    cout<<sum1<<endl;
   }
    return 0;
}
/*
BD400000
10111101010000000000000000000000
-0.046875
 
BD9DE0CB
10111101100111011110000011001011
-0.0635395
3C181F9A
00111100000110000001111110011010
0.0079422
BD4EAAED
10111101010011101010101011101101
-0.0469065
3F0690F8
00111111000001101001000011111000
0.500015
3F598C56
00111111010110011000110001010110
0.758301
*/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Sunshine_gao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值