使用'<<<<<<< 1'而不是'* 2'?

时间:2009-09-21 03:54:37

标签: bit-manipulation

我已经看过几次,但在我看来,使用按位移位会妨碍可读性。为什么用它?它比仅乘以2更快吗?

6 个答案:

答案 0 :(得分:22)

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

答案 1 :(得分:17)

在没有通过发出左移指令优化* 2调用的旧编译器上更快。这种优化非常容易检测,任何体面的编译器都可以。

如果它影响可读性,则不要使用它。始终首先以最清晰简洁的方式编写代码,然后如果遇到速度问题,请返回并进行配置并进行优化。

答案 2 :(得分:6)

当您关注正在使用的数据的各个位时,会使用它。例如,如果要将单词的高位字节设置为0x9A,则不会写入

n |= 0x9A * 256

你写道:

n |= 0x9A << 8

这使得您更清楚地使用位而不是它们所代表的数据。

答案 3 :(得分:2)

对于某些架构,位移比乘法更快。但是,任何有价值的编译器都会将* 2(或任何乘以2的幂)优化为左移位(当位移更快时)。

答案 4 :(得分: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个以上的旗帜。

答案 5 :(得分:1)

如果您使用的是旧的C编译器,则最好使用按位。为了便于阅读,您可以对代码进行评论。