2012-03-23 73 views
-1

我正在做位數&兩位數組之間保存old_array結果,我想擺脫if/else語句。我應該使用BIT_STATE宏,但是如何?如何用位操作替換這個if/else語句?

#define BYTE_POS(pos) (pos/CHAR_BIT) 
#define BIT_POS(pos) (1 << (CHAR_BIT - 1 - (pos % CHAR_BIT))) 
#define BIT_STATE(pos, state) (state << (CHAR_BIT - 1 - (pos % CHAR_BIT))) 

if (((old_array[BYTE_POS(old_pos)] & BIT_POS(old_pos)) != 0) && 
    ((new_array[BYTE_POS(new_pos)] & BIT_POS(new_pos)) != 0)) 
{ 
    old_array[BYTE_POS(old_pos)] |= BIT_POS(old_pos); 
} 
else 
{ 
     old_array[BYTE_POS(old_pos)] &= ~(BIT_POS(old_pos)); 
} 
+4

如果您將代碼簡化爲相關位,將會非常有幫助。例如,你有'old_array [BYTE_POS(old_pos)]'是否相關?你不能只用'x'嗎? – 2012-03-23 10:45:47

+0

[位操作而不是如果複製位圖]的可能的重複(http://stackoverflow.com/questions/9829544/bit-operation-instead-of-if-for-copying-bit-maps) – 2012-03-23 11:40:58

+0

相關,但不重複。 – maasha 2012-03-23 12:24:32

回答

0

是的,這樣的代碼看起來有點難看。 我不認爲BIT_STATE在這裏很有用。 (國必須爲0或預期的1工作)

我看到下面的方法來擺脫他們的

一)使用C++位域

例如 http://en.wikipedia.org/wiki/Bit_field

B) 「隱藏「該類中的代碼/方法/功能

c) 我認爲這相當於您的代碼

if ((new_array[BYTE_POS(new_pos)] & BIT_POS(new_pos)) == 0)) 
{ 
    old_array[BYTE_POS(old_pos)] &= ~(BIT_POS(old_pos)); 
} 

或內襯

old_array[BYTE_POS(old_pos)] &= 
     ~((new_array[BYTE_POS(new_pos)] & BIT_POS(new_pos)) ? 0 : BIT_POS(old_pos)); 
+0

是的,這是對if/else語句的簡化。現在我只需要擺脫這一點。建議a-c)指出。 – maasha 2012-03-23 11:19:11

+0

我不認爲你可以擺脫「如果」oe「?:」沒有位域 – 2012-03-23 11:26:58

1

您可以隨時計算出兩個結果,然後結合起來。最大的問題是計算一個合適的位掩碼。

E.g.

const uint32_t a = 41, 
     uint32_t b = 8; 

const uint32_t mask[2] = { 0, 0xffffffff }; 

const uint32_t result = (a&mask[condition]) 
         | (b&mask[!condition]); 

或避免一元不

const uint32_t mask_a[2] = { 0, 0xffffffff }, 
       mask_b[2] = { mask_a[1], mask_a[0] }; 

const uint32_t result = (a&mask_a[condition]) 
         | (b&mask_b[condition]); 

但是:當進行逐位操作,總是要小心參與的位數。一種小心的方式是固定大小的類型,如uint32_t,他們可能會或可能不會在您的平臺上定義(但如果沒有,好處是您會收到編譯錯誤),或仔細使用模板。其他類型,包括char,int甚至bool可以具有超出某個定義的最小值的任何大小。

0

採取表達

(new_array [BYTE_POS(new_pos)] & BIT_POS(new_pos))

其爲0或比特BIT_POS(new_pos)具有1,並且如果移動,直到位組是在BIT_POS(old_pos)

(new_array [BYTE_POS(new_pos)] & BIT_POS(new_pos))< <(old_pos - new_pos)

現在,並用結果old_array [BYTE_POS(old_pos)]

old_array [BYTE_POS(old_pos)] & = old_array [BYTE_POS(old_pos)]

唯一訣竅在於,它是依賴於實現(至少它使用的是)會發生什麼如果你轉移負數。因此,如果您已經知道old_pos是否大於或小於new_pos,則可以在適當時替換>>(new_pos - old_pos)。

我沒有試過這個。我可能有< <和>>交換。