簡體   English   中英

(B&(1 &lt; <i)) VS ((b > &gt; i)和1)C ++

[英](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喜歡使用btsetc (或者在適當的時候在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM