2012-09-28 24 views
1

如果兩者都給出相同的結果,我應該更喜歡+(加法)運算符還是|(或)運算符?如果兩者都能得到相同的結果,我應該選擇加法還是邏輯OR運算符?

我知道添加和邏輯或是不同的東西。但是他們有時會在一些宏中執行相同的操作,特別是在使用字節和位進行播放時。在這種情況下,我應該選擇哪一個?

實施例:

uint8_t Byte1 = 0x02; // 0000 0010 
uint8_t Byte2 = 0x80; // 1000 0000 
uint16_t Word1, Word2; // 0000 0010 1000 0000 = 640 = 0x0280 

Word1 = (Byte1 << 8) + Byte2; 
Word2 = (Byte1 << 8) | Byte2; 

std::cout << "Word1 = " << Word1 << std::endl; 
std::cout << "Word2 = " << Word2 << std::endl; 

輸出:

字1 = 640
字2 = 640

+0

這是一個棘手的問題,因爲在可讀性方面都不是明顯的贏家。 – Mysticial

+0

你應該更喜歡什麼?性能?那麼,位操作稍微快一點,但我不認爲你會注意到這一點。可讀性?我認爲他們都很清楚,但這取決於他們的意圖。 –

+0

@Adriano我見過這個問題的唯一地方是SSE,其中邏輯指令具有3個IPC吞吐量,而只有2個IPC用於添加。 (在目前的英特爾處理器上) – Mysticial

回答

6

當處理的位模式,邏輯運算符是適當的。操作數值時,算術運算符是適當的。

1

我會避免在同一表達式混合位操作和算術運算,所以我會寫

Word1 = (Byte1 * 256) + Byte2; 

Word2 = (Byte1 << 8) | Byte2; 

可讀性是唯一約在這裏擔心,因爲一個好的優化器應該爲這兩個表達式生成相同的確切代碼。

+0

請注意,對於有符號類型,除以2的權力並不等同於右移。對於碰巧是積極的價值觀,這些行爲將是相同的,但轉變往往會更快,有時相當多。對於負值,右移是實現定義的,但是在大多數實現中'(x >> 2)'被有效地定義,並且使用'/'運算符爲任何等效表達式提供了更快,更清晰的替代方案。 – supercat

相關問題