2009-09-21 76 views
6

我已经看过几次了,但在我看来,使用按位左移会阻碍可读性。为什么使用?它比只乘以2还快吗?使用'<< 1'而不是'* 2'有没有优势?

+0

这很容易测试。只是测试它。 – 2009-10-29 22:30:54

+0

怎么样?通过使用'时间'? – 2009-11-01 18:38:04

回答

17

在旧编译器中,通过发出左移指令不优化* 2调用的速度更快。该优化非常容易检测,并且任何体面的编译器都已经完成。

如果它影响可读性,那就不要使用它。总是先以最简洁明了的方式编写代码,然后如果遇到速度问题,请返回并进行配置文件并进行手动优化。

2

对于某些体系结构,位移比乘法快。然而,任何值得其盐值的编译器都会优化* 2(或任何乘以2的幂)到左位移位(当位移将更快时)。

1

如果您使用的是旧C编译器,则最好使用按位。为了可读性,你可以评论你的代码。

22

您应该在乘法时使用*,并且在位移时使用< <。它们在数学上是等价的,但是具有不同的语义含义。例如,如果您正在构建标志字段,请使用位移。如果您正在计算总数,请使用乘法。

+0

非常好的一点。如果你想把位移到一个位置,使用'<< 1'。如果你想让一个数字大两倍,使用'* 2'。同样的效果,但更清楚你使用的号码。 – nickf 2009-09-21 04:09:02

+2

+1。在你的代码中表达你的** intent **,不要尝试再次猜测编译器(除非你已经对代码进行了剖析并确定这样做或者另一种方式会在性能上产生重大影响)。 – 2009-09-21 17:08:17

6

当您关注您正在使用的数据的各个位时,会使用它。例如,如果你想设置一个字0x9A的高字节,你不会写

n |= 0x9A * 256 

你会写:

n |= 0x9A << 8 

这使得它更清晰,你正在使用位,而不是它们所代表的数据。

2

对于用作位字段值的可读性:

enum Flags { UP  = (1<<0), 
      DOWN  = (1<<1), 
      STRANGE = (1<<2), 
      CHARM = (1<<3), 
      ... 

我认为这是优选任一 '= 1,...,= 2,... = 4' 或“= 1,.. 。= 2,= 2 * 2,... = 2 * 3',特别是如果您有8个以上的标志。

相关问题