http://acm.hdu.edu.cn/showproblem.php?pid=1289

对二进制数进行位运算。

首先可以百度一下IEEE 754的规则。

以6560.91为例:

6560.91的二进制表示为1100110100000.111010001111010111,写成科学计数法就是1.100110100000111010001111010111 * 2^12

s有一位,是符号位,为正数,符号位是0。e有八位,代表二进制数的指数,这时e就是12(sample输出的第一个数)。f代表有效部分,有23位,为100110100000111010001111010111 。

所以,符号位是0
然后用它的指数12加上127(注释中有解释)得到139 写成二进制是
10001011
再取23个有效位10011010000011101000111

拼起来这三个数0-10001011-10011010000011101000111是01000101110011010000011101000111,十六进制就是0x45cd0747,这个数就是1.601785(sample输出的第二个数)

 

View Code
#include <stdio.h>
int main ()
{
    float f;
    int *pp=(int*)(&f);//把浮点型数f转化成2进制,取f地址存到整型指针里 
    int e;
    while(~scanf("%f",&f))
    {
        e=(*pp>>23)&0xff;//取中间八位指数 
        *pp&=0x807fffff;//把指数位全变为0 
        *pp|=0x3f800000;//把指数位变为01111111 
        printf("%d %f\n",e-127,f);//8位存指数,结果偏移127位,127表示指数为0 
    }
    return 0;
}