位运算之美——用+,-和位运算实现正整数除法和取模(二).docxVIP

位运算之美——用+,-和位运算实现正整数除法和取模(二).docx

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
位运算之美——用,-和位运算实现正整数除法和取模(二)

HYPERLINK /xiaoyisnail/archive/2009/09/21/96883.html 位运算之美——用+,-和位运算实现正整数除法和取模(二)作者: HYPERLINK /xiaoyisnail/ 翼帆@cppblog?? 原文地址: HYPERLINK /xiaoyisnail/archive/2009/09/21/96883.html \o /xiaoyisnail/archive/2009/09/21/96883.html /xiaoyisnail/archive/2009/09/21/96883.html 本文版权归作者和cppblog共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。? 终于有时间写本文的第二部分了。在 HYPERLINK /xiaoyisnail/archive/2009/09/19/96707.html 上一篇文章(下文中称为“文(一)”)中,我提出了一个具体的问题“只能用+,-和位运算实现正整数除法(/)和取模(%)”,并整理了一些和位运算相关的题目和算法,本文将给出上述问题的一个完整的解答思路和实现。首先思考最简单的除法实现,即循环减除数,减到不能再减为止,所减次数即所求的商,事实上这就是我们初学四则运算时对除法的定义,实现:?1int?integer_div_0(int?dividend,?int?divisor) ?2{ ?3????if(divisor?==?0) ?4????{ ?5????????cout非法参数,除零错endl; ?6????????exit(1); ?7????} ?8 ?9????int?res?=?0; 10????while((dividend-=divisor)=0) 11????????++res; 12 13????return?res; 14} 很显然,这个简单的实现是非常低效的,求integer_div_0(a,b)的时间复杂度为O(a/b),当a很大b很小时,计算开销很大,有什么办法能提高效率吗?考虑到循环减除数同时比较差是否大于等于0有点类似于在一个一个数组或是linked list中顺序搜索某个目标值,在较差的情况下近似于搜索整个问题空间,这样的开销必然很大,那么只要找到某个方法来减少需要搜索的问题空间就可以提高性能了。于是,自然可以想到如下算法:以除数为初始测试值,以2的指数为步长来搜索问题空间,当被除数与测试值的差小于除数时便结束搜索,若在这之前测试值大于被除数,则将被除数减去前一个测试值,并重复上述过程直到搜索结束。举个例子,求1200/3: 顺序搜索时,我们要与1200比较的数有:3,6,9,12,15,...,1998,2001,比较次数667次 以2的指数为步长搜索时,与1200比较3,6,12,24,48,96,192,384,768,1536,然后与1200-768=432再进行比较3,6,12,24,48,96,192,384,768,再取432-384=48比较3,6,12,24,48,搜索结束,比较次数共24次,比顺序搜索有很大的提高。你可能会问,为什么要以2的指数为步长来搜索呢?答案是,这样我们就可以使用位操作来进一步提高计算效率了。下面是这个算法的实现:?1int?integer_div_1(unsigned?int?dividend,?unsigned?int?divisor) ?2{ ?3????if(divisor?==?0) ?4????{ ?5????????cout非法参数,除零错endl; ?6????????exit(1); ?7????} ?8 ?9????if(dividend??divisor)?return?0; 10????unsigned?int?k=0,c=divisor,?res=0; 11???? 12????for(;dividend=c;c=1,k++) 13????????if(dividend-c??divisor) 14????????????return?1k; 15 16????return?integer_div_1(dividend-(c1),?divisor)+(1(k-1)); 17}注意到最后一行的尾递归,再把代码优化为非递归如下:?1//非递归整数除法 ?2int?integer_div_2(unsigned?int?dividend,?unsigned?int?divisor) ?3{ ?4????if(divisor?==?0) ?5????{ ?6????????cout非法参数,除零错endl; ?7????????exit(1); ?8????} ?9 10????

文档评论(0)

cgtk187 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档