我已经看过几次了,但在我看来,使用按位左移会阻碍可读性。为什么使用?它比只乘以2还快吗?使用'<< 1'而不是'* 2'有没有优势?
回答
在旧编译器中,通过发出左移指令不优化* 2调用的速度更快。该优化非常容易检测,并且任何体面的编译器都已经完成。
如果它影响可读性,那就不要使用它。总是先以最简洁明了的方式编写代码,然后如果遇到速度问题,请返回并进行配置文件并进行手动优化。
对于某些体系结构,位移比乘法快。然而,任何值得其盐值的编译器都会优化* 2(或任何乘以2的幂)到左位移位(当位移将更快时)。
如果您使用的是旧C编译器,则最好使用按位。为了可读性,你可以评论你的代码。
您应该在乘法时使用*,并且在位移时使用< <。它们在数学上是等价的,但是具有不同的语义含义。例如,如果您正在构建标志字段,请使用位移。如果您正在计算总数,请使用乘法。
非常好的一点。如果你想把位移到一个位置,使用'<< 1'。如果你想让一个数字大两倍,使用'* 2'。同样的效果,但更清楚你使用的号码。 – nickf 2009-09-21 04:09:02
+1。在你的代码中表达你的** intent **,不要尝试再次猜测编译器(除非你已经对代码进行了剖析并确定这样做或者另一种方式会在性能上产生重大影响)。 – 2009-09-21 17:08:17
当您关注您正在使用的数据的各个位时,会使用它。例如,如果你想设置一个字0x9A
的高字节,你不会写
n |= 0x9A * 256
你会写:
n |= 0x9A << 8
这使得它更清晰,你正在使用位,而不是它们所代表的数据。
对于用作位字段值的可读性:
enum Flags { UP = (1<<0),
DOWN = (1<<1),
STRANGE = (1<<2),
CHARM = (1<<3),
...
我认为这是优选任一 '= 1,...,= 2,... = 4' 或“= 1,.. 。= 2,= 2 * 2,... = 2 * 3',特别是如果您有8个以上的标志。
- 1. 使用size_t而不是unsigned int有没有优势?
- 2. 使用.NET Framework 4.0 dll而不是2.0 dll有没有优势?
- 3. 使用hg convert合并2 repos而不是hg pull -f有没有优势?
- 4. 为什么输出cout << setprecision(2)<< 0.999是1而不是1.0?
- 5. C++优化,使用>而不是<=
- 6. 是VAR | = 1 << 2; reverisble?
- 7. ValueError异常:NUM必须为1 <= NUM <= 2,而不是3
- 8. 为什么YouTube等使用<object>而不是<iframe>?
- 9. 什么优势有没有使用“得到”,而不是访问一个地图
- 10. 使用无条件MIPS分支而不是跳转有没有优势?
- 11. 使用哈希(#)而不是查询字符串有没有任何优势
- 12. JSF 2.0:使用DataModel <T>而不是List <T>对于CRUD应用程序有没有什么优势
- 13. 使用直接Rfc调用而不是BAPI有优势吗?
- 14. 对CRC有没有优势?
- 15. 使用核心数据有什么优势? (而不是plist)
- 16. 使用bower而不是缩小javascript文件有什么优势?
- 17. 有使用按钮而不是链接的优势吗?
- 18. 使用键@array而不是0 .. $#数组有什么优势?
- 19. `Reduce`,而不是`<< - `
- 20. 在1页有2 <head>
- 21. 有没有什么场合可以使用<style>而不是css文件?
- 22. 使用<=>而不仅仅是排序和反转有没有好处?
- 23. 有没有办法使<g:链接调用POST而不是GET?
- 24. 有没有办法打印我的clickCount而不是使用<input>标签
- 25. 是否<input>没有<form>?
- 26. 在R中使用`-1L`而不是`-1`有没有危险?
- 27. TypeError:'undefined'不是函数(评估'i.replace(et,“<$1></$2>”)')
- 28. 为什么Java HashMap 1 << 30而不是1 << 31的最大容量?
- 29. SVN和Apache - 有没有什么优势?
- 30. 返回ICollection <T>而不是列表<T>的真正优势是什么?
这很容易测试。只是测试它。 – 2009-10-29 22:30:54
怎么样?通过使用'时间'? – 2009-11-01 18:38:04