我已经看过几次,但在我看来,使用按位移位会妨碍可读性。为什么用它?它比仅乘以2更快吗?
答案 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编译器,则最好使用按位。为了便于阅读,您可以对代码进行评论。