2011-08-15 18 views
3

我正在研究一個Objective-C程序,通過網絡獲取位域,並且需要根據這些位設置布爾變量。移位編碼效率(即整潔的技巧)

目前,我代表位域爲int的,然後使用位轉移,類似這樣(所有的自我屬性BOOL):

typedef enum { 
    deleteFlagIndex = 0, 
    uploadFlagIndex = 1, 
    moveFlagIndex = 2, 
    renameFlagIndex = 3 
} PrivilegeFlagIndex; 

int userFlag = 5; //for example 

// this would be YES 
self.delete = ((userFlag & (1 << deleteFlagIndex)) == (1 << deleteFlagIndex)); 
// this would be NO 
self.upload = ((userFlag & (1 << uploadFlagIndex)) == (1 << uploadFlagIndex)); 

而且這個工程(以最好的我知識),但我想知道 - 有更多 有效的 簡潔的方式來編寫所有的位使用花哨的技巧/破解twiddling?我問,因爲我會這樣做很多的標誌(超過30)。

我知道我可以用這個方法這個問題,以及:

self.move = ((userFlag & (1 << moveFlagIndex)) > 0) 

...這確實減少打字量,但我不知道是否有一個很好的理由不這樣做是辦法。

編輯:修改爲簡潔而非高效 - 我並不擔心執行性能,而是以巧妙方式做到這一點的技巧和最佳實踐。

+2

「更有效的方式」 - 比什麼效率更高?節省幾納秒?你如何看待網絡通信速度比較? –

+2

不要使用任何*花哨的技巧/破解*,因爲**你**必須在2年內瞭解代碼!如果您完全使用軌道來實現這一點,則不值得節省幾個毫微秒。 – eckes

+0

這兩個好處,特別是在處理像偏移一樣的東西時(有時我仍然很難把頭包裹起來)。 「效率」可能是錯誤的詞語,我真正的意思是「合理」。我絕對不想在執行期間削減納秒,我只是從更有經驗的程序員那裏尋找技巧。 – Chuck

回答

11

嘗試:

typedef enum { 
    deleteFlag = 1 << 0, 
    uploadFlag = 1 << 1, 
    moveFlag = 1 << 2, 
    renameFlag = 1 << 3 
} PrivilegeFlags; 

現在你可以直接使用|將它們結合起來。

通常情況下,它足以對證0:

if (userFlag & deleteFlag) { 
    // delete... 
} 
+0

爲了記錄,如果您開始使用位掩碼,則對0進行檢查將失敗;想象一下enum有一個'modifyFlag = deleteFlag | moveFlag | renameFlag'條目。只要檢查'if(userFlag&modifyFlag)',如果設置了三位中的任何一位,就會產生'true'。在這種情況下,你必須求助於'if((userFlag&modifyFlag)== modifyFlag)'。 –

+0

當然,如果你想檢查多個位,你必須檢查位模式是否相等。 –

0

你可能想嘗試使用位域,讓編譯器做了優化本身。

+0

我也可以試試這個。位字段以8字節數據的形式出現(儘管目前只使用了64位數據中的37位),並且我不確定如何正確地將數據轉換爲我設置的位域結構。 – Chuck