- 1、本文档共5页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
??整数的平均值对于两个整数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;}一般情况下,如果要我们写一个求绝对值的函数,我们的实现很有可能会是这样:templateclass?TT?abs_Normal(T?tNum){????if(tNum??0.0)????????return?tNum;????else????????return?-tNum;}也就是说我们会用到一个if-else判断来决定是否反转符号位。在3D游戏软件,或一些对性能要求比较高的底层系统中,当大规模的求绝对值时,这个if-else结构会带来性能上的损失,那么,如何来消除if-else结构呢?或许会有人说,我们可以用三元操作符啊:templateclass?TT?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相与而将符号位置0inline?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
您可能关注的文档
最近下载
- 大学生的智慧篮球_西南交通大学中国大学mooc课后章节答案期末考试题库2023年.docx
- 2024年中考语文真题分类汇编非连及其他文本.docx VIP
- 《公差配合与测量技术》复习试卷三套含答案.docx
- 高考语文复习:古诗文补充背诵篇目——《贺新郎·国脉微如缕》课件23张.pptx
- 外研版(三年级起点)六年级上册英语期末《作文》专项训练(附范文).docx
- 四川省成都市第七中学2024-2025学年高二上学期11月期中考试 政治含解析.pdf
- 四川省2023-2024学年 四川省高职考第一轮系统性考试-智能制造类应知+应会(含答案).pdf VIP
- [中央]2023年中国社会科学院农村发展研究所招聘笔试历年高频考点(难、易错点)附带答案详解.docx VIP
- 英语语音达标测试题知识.pdf VIP
- 公务员考试行测辅导类比推理必会对应关系解析.docx VIP
文档评论(0)