[英](b&(1<<i)) VS ((b >> i) & 1) C++
通常有必要將數據類型表示為一系列位,並在整個長度的循環內讀取它們。 盡管我發現((b >> i) & 1)
更直觀,但是最近我看到了一本書的使用(b&(1<<i))
。 它們中的任何一個是更有利還是更有效?如果其中之一是,為什么?
假設您使用此工具進行測試(因此結果的差異無關緊要),則取決於上下文,編譯器對其進行的操作以及其他因素。
例如,當使用GCC 7.3針對現代x86進行編譯時,它們完全相同 ,兩者都可以編譯為以下順序:
sarx eax, edi, esi
and eax, 1
而且,當使用結果實際做出決定(而不是實現布爾值)時,代碼仍然可以相同。 顯然,如果代碼將相同,則效率不會有差異。 Clang喜歡使用bt
和setc
(或者在適當的時候在cmov或控制流中使用該標志),但是對兩個代碼片段也做同樣的事情。 MSVC確實以不同的方式來編譯代碼片段,並且在某種意義上也許“更喜歡” 1 << i
公式。
從字面上實現b & (1 << i)
(我沒有觀察到任何編譯器實際上執行過)需要一條額外的指令將常量1加載到寄存器中,盡管這並不一定意味着會花費額外的時間(盡管可以) :創建1獨立於其他所有東西,因此它可能比其他所有東西先執行,然后移位獨立於b
因此它可以在i
准備好之后但在b
之前執行。
哪個更有利?
取決於您需要什么數據。
((b >> i) & 1) gives you a 1 or 0.
(b & (1 << i)) gives you a 0 or 2^i.
哪個更有效?
它們之間的效率差異可以忽略不計。 另外,區別在於不同的體系結構和編譯的代碼。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.