




全文预览已结束
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
整数的平均值对于两个整数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;一般情况下,如果要我们写一个求绝对值的函数,我们的实现很有可能会是这样:templateTabs_Normal(TtNum)if(tNum0.0)returntNum;elsereturn-tNum;也就是说我们会用到一个if-else判断来决定是否反转符号位。在3D游戏软件,或一些对性能要求比较高的底层系统中,当大规模的求绝对值时,这个if-else结构会带来性能上的损失,那么,如何来消除if-else结构呢?或许会有人说,我们可以用三元操作符啊:templateTabs_Normal(TtNum)returntNum0.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相与而将符号位置0inlinefloatFabs_and(floatfNum)#ifdefUSE_ASMfloatfOut;_asmMOVEAX,fNum;ANDEAX,INV_SIGN_BIT;/setthesignbitto0byANDMOVfOut,EAX;returnfOut;#elseint*temp=(int*)&fNum;intout=*temp&INV_SIGN_BIT;return*(float*)&out);#endif注:1)这里将float转化成int的原因是C语言不支持float的移位操作。2)移位:通过先逻辑左移1位,再逻辑右移一位将符号位置0inlinefloatFabs_shift(floatfNum)#ifdefUSE_ASMfloatfOut=0;_asmMOVEAX,fNum;SHLEAX,1;/setthesignbitto0byshiftleftthenrightSHREAX,1;MOVfOut,EAX;returnfOut;#elseunsignedint*temp=(unsignedint*)&fNum;unsignedintout=*temp;out=out1;return*(float*)&out);#endif注:1)这里使用unsigned int的原因是C语言的移位操作对有符号数是算术移位,对无符号数是逻辑移位。而我们需要的是逻辑移位2 int求绝对值因为整型的内部表示是反码,我们不能简单的通过符号位置0求绝对值,下面的算法很好的解决了这个问题:inlineintAbs_bit(intiNum)#ifdefUSE_ASMintiOut=0;_asmMOVEAX,iNum;MOVEDX,EAX;SAREDX,31;/allofedxsbitareeaxssignbit:000.or111XOREAX,EDX;/thisinterestingalgorithmhelptoavoidifelsestructureSUBEAX,EDX;MOViOut,EAX;returniOut;#elseintout=iNum;inttemp=iNum;temp=temp31;out=outtemp;out=out-temp;returnout;#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 = o
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 联合营销活动执行协议书
- 童年的味道记一次童年趣事作文8篇范文
- 护理学专业人才培养模式与影响因素分析
- 产品配方表格-原料配比
- 个人用户隐私保护条款合作协议
- 高中以定格为话题作文9篇范文
- 教育行业教师资格证书持有证明(8篇)
- 英语听力与口语技能试题集
- 区域性与文化差异在地理学人才培养中的适应性策略
- 生活中的好习惯值得培养议论文作文(5篇)
- 电力咨询费合同协议
- 2025-2030海洋环境监测行业市场深度调研及发展前景与投资研究报告
- 2025年中学生离队入团活动实施方案
- 玻璃基板制备技术考核试卷
- 南极磷虾油与红曲、辅酶Q10联用降低血脂效果研究
- 2025年上海市安全员C3证(专职安全员-综合类)考试题库
- 钱大妈加盟合同协议
- 《建筑工程识图》课件-梁平法施工图识读一
- 上海杨浦区社区工作者考试真题2024
- 汽车智能制造技术考核试卷
- 新公司法试题及答案
评论
0/150
提交评论