我已經看過幾次了,但在我看來,使用按位左移會阻礙可讀性。爲什麼使用?它比只乘以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