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