用位运算实现求绝对值用位运算实现求绝对值
整的平均值数
值于整两个数x,y~如果用 (x+y)/2 求平均值~值生溢出~因值 会x+y 可能大于会INT_MAX~
但是我值知道值的平均值是肯定不溢出的~我值用如下算法,它会
#define AVE(x,y) ((x)&(y))+(((x)^(y))>>1)
判一整是不是断个数2的值
值于一 个数x >= 0~判他是不是断2的值
#define POWER2(x) ((((x)&((x)-1))==0)&&((x)!=0))
不用temp交值整两个数
int x,y; swap(x,y)
void...
用位运算实现求绝对值
整的平均值数
值于整两个数x,y~如果用 (x+y)/2 求平均值~值生溢出~因值 会x+y 可能大于会INT_MAX~
但是我值知道值的平均值是肯定不溢出的~我值用如下算法,它会
#define AVE(x,y) ((x)&(y))+(((x)^(y))>>1)
判一整是不是断个数2的值
值于一 个数x >= 0~判他是不是断2的值
#define POWER2(x) ((((x)&((x)-1))==0)&&((x)!=0))
不用temp交值整两个数
int x,y; swap(x,y)
void swap(int &x , int &y){
x ^= y;
y ^= x;
x ^= y;
}
求浮点的值值值数
double abs(double y){
double x = y;
*(((int *) &x) + 1) &= 0x7fffffff;
return x;
}
一般情下~如果要我值一求值值值的函~我值的值值有可能是值值,况写个数很会
template
T abs_Normal(T tNum){
if(tNum > 0.0)
return tNum;
else
return -tNum;
}
也就是值我值用到一会个if-else判定是否反值符位。在断来决号3D游值值件~或一些值性能要求比值高的底值系值中~大值模的求值值值值~值当个if-else值值性能上的值失~那值~如何值消除构会来来if-else值,或值有人值~我值可以用三元操作符构呢会啊:
template
T abs_Normal(T tNum)
{
return tNum > 0.0 ? tNum : -tNum;
}
但是事值上值是值值不值值~因值其值值上值是存在if-else的判的;值值值可以反值值代值中看出,。断从来
我值是通值位操作消除来if-else判求值值值。断来
因值使用位操作~我值不得不考值我值操作值象值型的字值~下面我以都是数将4字值得float和int值例值值位操作求值值值。
首先~我值有必要了解一下float与int在值算机中的部示。内
1) float: float即数值精度浮点~"浮点数"由部分值成~尾和值值。在浮点表示方法中~小两即数
数数数将数写点的位置是浮值的~值值可取不同的值。值了便于值算机中小点的表示~值定浮点成值格化的形式~尾的值值值大于等于即数0.1并且小于1~而唯一值定了小点的位置。尾的值度从数数将
影的精度~其符定的符。浮点的值值相于中的指~其大小定的响数号将决数号数当数学数将决数
表示范值。一浮点在值算机中的表值形式如下,个数
尾符 值值 尾有效值数号数
2) int: 用值值表示~因值正整的原值~反值~值值都是一值的~而值整的值值值是通值原值数数->反值->值值值值来的~所以~-3与3的部表示位差值不值值在符位内号
其次~值里先列出在代值中用到的宏,两个
#define INV_SIGN_BIT 0x7fffffff //用反值符位来号
#define USE_ASM //是否使用值值代值
1 float求值值值
知道了float的部表示~我值知道要求其值值值~只要其尾符位置内将数号0即两可。值又有下面值方法,
1,,通值和与INV_SIGN_BIT相"与"而符位置将号0
inline float Fabs_and(float fNum)
{
#ifdef USE_ASM
float fOut;
__asm
{
MOV EAX, fNum;
AND EAX, INV_SIGN_BIT; //set the sign bit to 0 by AND
MOV fOut, EAX;
}
return fOut;
#else
int* temp = (int*)&fNum;
int out = *temp & INV_SIGN_BIT;
return *((float*)&out);
#endif
}
注,
1)值里将float值化成int的原因是C值言不支持float的移位操作。
2,移位,通值先值值左移1位~再值值右移一位符位置将号0inline float Fabs_shift(float fNum)
{
#ifdef USE_ASM
float fOut = 0;
__asm
{
MOV EAX, fNum;
SHL EAX, 1; //set the sign bit to 0 by shift left then right
SHR EAX, 1;
MOV fOut, EAX;
}
return fOut;
#else
unsigned int* temp = (unsigned int*)&fNum;
unsigned int out = *temp;
out = out << 1;
out = out >> 1;
return *((float*)&out);
#endif
}
注,
1)值里使用unsigned int的原因是C值言的移位操作值有符是算值移位~值无符是值值移位号数号数。
而我值需要的是值值移位
2 int求值值值
因值整型的部表示是反值~我值不能值值的通值符位置内号0求值值值~下面的算法好的解了值值值很决个,
inline int Abs_bit(int iNum )
{
#ifdef USE_ASM
int iOut = 0;
__asm
{
MOV EAX, iNum;
MOV EDX, EAX;
SAR EDX, 31; //all of edx's bit are eax's sign bit: 000.. or 111
XOR EAX, EDX; //this interesting algorithm help to avoid "if else" structure
SUB EAX, EDX;
MOV iOut, EAX;
}
return iOut;
#else
int out = iNum;
int temp = iNum;
temp = temp >> 31;
out = out ^ temp;
out = out - temp;
return out;
#endif
}
注:
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~就是其值值值了。比如值于-2来值,
原值 反值值值值值全求反再加1值注
1000001011111101 111111100000000100000010大家可以看到第一最后一只有符位不同~也就值值了求其值值值。个与个数号
本文档为【用位运算实现求绝对值】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑,
图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。