回首页 回首页 ◎ 设为首页  
◎ 收藏本站  
◎ 给我留言  
  
  首 页  C/C++教程  C++之父的FAQ  C/C++动向  C/C++源代码  C/C++误区  Unix/Linux  下载中心  乱七八糟  蚂蚁的Blog  
  当前位置:首 页 >> C/C++教程 >> C/C++ 技巧 >> 巧用移位运算避免乘法运算
最 近 更 新
[转][C++] 巧用 mutable推荐
[C++] 巧用模板定义谓词
巧用异或交换整型变量的值
宏的一个妙用
[C/C++ 技巧] 提高程序..推荐
[C/C++ 技巧] 产生随机..
[C/C++技巧]巧用数组减..推荐
巧用移位运算避免乘法运算
无条件循环
最 新 推 荐
[转][C++] 巧用 mutable推荐
[C/C++ 技巧] 提高程序..推荐
[C/C++技巧]巧用数组减..推荐
热 门 排 行
[C/C++ 技巧] 产生随机..
[C/C++ 技巧] 提高程序..推荐
巧用移位运算避免乘法运算
[C/C++技巧]巧用数组减..推荐
宏的一个妙用
[转][C++] 巧用 mutable推荐
无条件循环
巧用异或交换整型变量的值
[C++] 巧用模板定义谓词
站 内 搜 索

Web stdcpp.cn
关键词

搜索方式

搜索范围

精确匹配
广 告

巧用移位运算避免乘法运算


来源:蚂蚁的 C/C++ 标准编程 作者:antigloss 等级:一般
发布于2005-10-24 12:12 被读4106次 【字体:

    使用移位运算来避免乘法运算是一种常用技巧,不过乘数必须都是正整数,而且必须至少有一个是 2 的 n 次方,例如:2,4,8,16,32……移位运算的特点是速度快,而乘法运算速度较慢,把乘法运算转化为移位运算可以稍微提高程序运行效率。例如:

        num *= 32;
        等同于
        num <<= 5; /* 2 的 5 次方等于 32 */

如果乘数不是 2 的 n 次方,我们可以把乘数分解成几个 2 的 n 次方的和:
        num *= 20;
        等于
        num *= (16 + 4);
        等于
        num = num * 16 + num * 4;
        等于
        num = (num << 4) + (num << 2);

不过,现在的编译器很聪明,它们会代替我们做这种优化。也就是说,如果我们写的语句是:
        num *= 100;
编译器会把这个语句优化为:
        num = (num << 6) + (num << 5) + (num << 2);

所以,我们没有必要手工进行这种优化,因为编译器会替我们完成。而且,就算进行了这种优化,速度也不会有太大提高。我们应该把精力用来改进算法,一个好的算法可以让程序运行效率大大提高!

本文版权归 蚂蚁的 C/C++ 标准编程 以及 作者 antigloss 共同所有,转载请注明原作者和出处。谢谢。



相关专题:暂无相关专题

上一篇:无条件循环
下一篇:[C/C++技巧]巧用数组减少if语句

共有评论 5 条 网友评分 2分 查看全部评论

游客:wyx
评分:0
楼主真的做过试验嘛? 还是 就是根据理论去想的?

其实 结果是相反的.  乘法要快于 移位.

楼主 有没有想到 对于整数次的乘积 编译器何尝不会优化成位移呢?
游客:antigloss
评分:0
你的话似乎有自相矛盾之嫌。

 引用:

其实 结果是相反的.  乘法要快于 移位.

楼主 有没有想到 对于整数次的乘积 编译器何尝不会优化成位移呢?

既然乘法快于位移,为啥编译器还会将乘法优化成位移呢?

而且,我文中也说了“现在的编译器很聪明,它们会代替我们做这种优化”。
游客:随便
评分:5
    能提供一个新的算法何尝不是好事啊,不管好与坏,我觉得都应该接受,因为在这的效果不显著,在别处说不定会大放异彩,所以还是支持楼主的
游客:forgot
评分:0
printf("%d", wyx.iq);
error C2039: 'iq' : is not a member of 'wyx'
游客:juniechu
评分:0
wyz你不懂就不要乱说。乘法比位运算慢。这是常识。

查看全部评论

【发表评论】 评分:1分 2分 3分 4分 5分


验证码:

Powered By Www.Xydw.COM Ver1.14 管理
Copyright © 2005-2006 蚂蚁的 C/C++ 标准编程 All Right Reserved. XCMS
粤ICP备06014124号   站长:Antigloss