为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

用位运算实现求绝对值

2017-11-15 7页 doc 20KB 39阅读

用户头像

is_153723

暂无简介

举报
用位运算实现求绝对值用位运算实现求绝对值 整的平均值数 值于整两个数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,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索