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,就是其绝对值了。
知道了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
 posted on 
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号