回答
注意
正如評論,這取決於很多因素。另外,你不應該在意。在任何真實的節目中,我不相信你會關注這樣的低級細節。不成熟的優化是時間的可怕浪費。
另外,除非您的平等概念只是零/非零的概念,否則這些不等於操作。
但它是一個有趣的練習
使用GCC與-O3和拆卸我看到:
x & (1 << i)
The first version
Dump of assembler code for function op1:
0x0000000000000000 <+0>: mov %esi,%ecx
0x0000000000000002 <+2>: mov $0x1,%eax
0x0000000000000007 <+7>: shl %cl,%eax
0x0000000000000009 <+9>: and %edi,%eax
0x000000000000000b <+11>: retq
End of assembler dump.
而且
x >> i % 2
Dump of assembler code for function op2:
0x0000000000000010 <+0>: mov %esi,%ecx
0x0000000000000012 <+2>: sar %cl,%edi
0x0000000000000014 <+4>: mov %edi,%edx
0x0000000000000016 <+6>: shr $0x1f,%edx
0x0000000000000019 <+9>: lea (%rdi,%rdx,1),%eax
0x000000000000001c <+12>: and $0x1,%eax
0x000000000000001f <+15>: sub %edx,%eax
0x0000000000000021 <+17>: retq
所以這是一個shift left
和and
Vs的shift right
,load effective address
和and
操作。在這個硬件上看起來非常明顯,速度會更快,但除非你在微控制器上,否則顯然通常不是那麼清楚。讓我們測試它。
我做了一個類似千萬次調用(內聯)操作的循環,並且肯定會返回操作結果的總和,所以編譯器不會把它全部丟掉。
[[email protected] Test]$ gcc -O3 so.c -o so
[[email protected] Test]$ time ./so
real 0m0.388s
user 0m0.384s
sys 0m0.003s
[[email protected] Test]$ time ./so
real 0m0.384s
user 0m0.380s
sys 0m0.003s
[[email protected] Test]$ vi so.c // I changed the function to the second one
[[email protected] Test]$ gcc -O3 so.c -o so
[[email protected] Test]$ time ./so
real 0m0.380s
user 0m0.377s
sys 0m0.002s
[[email protected] Test]$ time ./so
real 0m0.380s
user 0m0.379s
好的夾頭 - 完全一樣。現代超級縮放處理器中有足夠的硬件來隱藏任何差異。
編譯器會產生不同的輸出,因爲如果'x'被簽名並且爲負,則表達式的行爲會有所不同。 – hirschhornsalz
正如我注意到的,即使對於無符號值,它們的行爲也不同,除非您正在測試'== 0'。 –
的慣用方法來提取一點或者是
(x >> i) & 1
這也將類似的多個位工作,或者
x & (1 << i)
,如果你只是想測試單個位。
注意,在C x
不得爲負(優選聲明無符號),並且如果x
比需要指定一個1的int
較長也是在第二個那麼久。
使用%
會使讀者感到困惑,並且可能會有更差的性能,這取決於編譯器。
- 1. 誰更快:PEG還是GLR?
- 2. C++更快:if還是length?
- 3. 是布爾還是零比較更快?
- 4. 哪個更快:從$ _SESSION獲取數組還是從json文件獲取數組?
- 5. 這是更快(我== 0)或(I')
- 6. 創建方法還是更新更快?
- 7. Linq更快,更慢還是相同?
- 8. 第一個CPU是8位還是4位?
- 9. 速度更快:JDBC還是JNDI?
- 10. 「(key in obj)」還是「.forEach」更快?
- 11. 哪個更快 - INSTR還是LIKE?
- 12. 速度更快:JMP還是一串NOP?
- 13. 哪種更快:Union還是Concat?
- 14. 速度更快...循環還是分裂?
- 15. 哪個更快:多行還是多列?
- 16. 無論系統是32位還是64位,int都是32位還是64位?
- 17. django是設置操作更快還是循環?
- 18. 這是更好還是更快的方法?
- 19. 是matlab mex函數還是共享對象/ DLL更快?
- 20. 哪個更快:i = i + 2或i + = 2?
- 21. 是Facebook更快還是本地數據庫?
- 22. PHP:更快速檢查變量是整數還是以#
- 23. 它是位圖還是MetaFile?
- 24. 什麼是更快?繪圖還是合成?
- 25. atmega32是8位還是16位?
- 26. Cython中的複數 - I還是1j?
- 27. LINQ循環實際上更快還是僅僅是語法糖?
- 28. 在Python裏是更快:若還是儘量
- 29. 轉換運算符快還是不快?
- 30. 在jQuery中,更快,選擇器還是等效函數,還是它依賴於?
它取決於平臺和編譯器。 –
@OliCharlesworth和優化標誌。 – robert
在一個愚蠢的實現中,第一個可能會更快,因爲'&(可能)比'%'更快,並且輪班左右移動。但在某些處理器上,'&'和'%'同樣快,而且更重要的是,除了最笨的編譯器之外,所有的處理器都會將'%2'轉換爲掩碼操作。 –