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個以上的標誌。

相關問題