题目要求:
这个函数计算浮点数f的绝对值[f]。如果f是NaN,函数应该简单的返回f。
Unsigned float_abs (unsiged f)
{
/**************/
return/*******/;
}
先分析题目,题目有两个要求:
1.判断f是否是NAN类型,如果是返回f。
2.如果不是NAN类型,返回f的绝对值。
首先来了解一下浮点数在内存中的储存方式:
什么是NAN类型?
NaN(NotaNumber,非数)是计算机科学中数值数据类型的一类值,表示未定义或不可表示的值。
知道了什么是NAN,那该如何判断一个浮点数是NAN类型?
对于浮点数来说,阶码的每个二进制位全为1并且尾数不全为0即为NAN类型。
顺便提一下,阶码的每个二进制位全为1并且尾数全为0为INF类型。
对于float类型来说,我们只用把他左移1位然后右移24位就能得到他的阶码,用代码表示即为(f<<1)>>24
NAN类型的阶码全为1,0xFF(或0x7fffffff)也全为1,所以我们将NAN的阶码与0xFF进行与(&)运算得到的结果也全为1,即NAN类型与0xFF与运算后结果仍然为0xFF,所以我们可以通过((f<<1)>>24)&0xFF结果是否为0xFF来判断他是否为NAN类型。
ps:与运算(&): x&1=x x&0=0 与1&结果为原来的数,与0&结果为0。
如果不是NAN类型那如何返回f的绝对值呢?
float的符号位在最左边 所以我们只需要将f左移一位然后右移一位就可以将符号位变为0代码表示即为(f<<1)>>1。
最后float类型不能进行位运算,所以我们要将float进行强制类型转化为unsigned类型位运算后再强制类型转换为float类型输出。
最终位运算代码如下:
运行结果: