1 对float求绝对值
知道了float的内部表示,我们知道要求其绝对值,只要将其尾数符号位置0即可。

通过先逻辑左移1位,再逻辑右移一位将符号位置0
    unsigned int* temp = (unsigned int*)&fNum;
    unsigned int out = *temp;
    out = out << 1;
    out = out >> 1;
    return *((float*)&out);
这里使用unsigned int的原因是C语言的移位操作对有符号数是算术移位,对无符号数是逻辑移位。而我们需要的是逻辑移位。

2 int求绝对值
因为整型的内部表示是反码,我们不能简单的通过符号位置0求绝对值,下面的算法很好的解决了这个问题:
    
    int out = iNum;
    int temp = iNum;
    temp = temp >> 31;
    out = out ^ temp;
    out = out - temp;
    return out;

注:
1)对于代码
         temp = temp >> 31;
         out = out ^ temp;
         out = out - temp;
如果iNum是正数:
         temp = temp >> 31; //temp = 0
         out = out ^ temp; //与0异或不变
         out = out - temp; //减0不变
 
out的结果就是iNum,即正数的绝对值是其本身,没问题
 
如果iNum是负数:
         temp = temp >> 31; //temp = oxffffffff
         out = out ^ temp; //out为iNum求反
         out = out - temp; // 此时temp = 0xffffffff = -1, 所以out = out + 1

把一个负数的补码连符号位求反后再加1,就是其绝对值了。
 posted on 2009-06-12 09:05  清水湾  阅读(178)  评论(0)    收藏  举报