2012-10-25 49 views
4

我想打開/關閉表示難度級別的3顆星。我不想使用幾個條件,是否可以通過按位操作來實現?使用位操作設置某些標誌的最佳做法

比方說,我已經宣佈這樣一個枚舉:

enum 
{ 
    EASY = 0, 
    MODERATE, 
    CHALLENGING 
} Difficulty; 

我想找到一個位的操作,讓我找到了打開哪個明星或關閉:

如:

level 2 (challenging) 
star 0 -> 1 
star 1 -> 1 
star 2 -> 1 

level 1 (moderate) 
star 0 -> 1 
star 1 -> 1 
star 2 -> 0 

level 0 (easy) 
star 0 -> 1 
star 1 -> 0 
star 2 -> 0 
+0

枚舉不如果更容易,必須從0開始 – tiguero

+0

第二顆恆星不能在第一顆恆星關閉時打開,因此您可以使用難度變量。 –

+0

@timjver你的意思是我不需要實際使用按位操作? – tiguero

回答

5

你會想要做這樣的事情:

typedef enum Difficulty : NSUInteger 
{ 
    EASY = 1 << 0, 
    MODERATE = 1 << 1, 
    CHALLENGING = 1 << 2 
} Difficulty; 

然後檢查一下:

- (void) setStarsWithDifficulty:(Difficulty)diff 
{ 
    star0 = (diff & (EASY | MODERATE | CHALLENGING)); 
    star1 = (diff & (MODERATE | CHALLENGING)); 
    star2 = (diff & CHALLENGING); 
} 
+0

我驗證了這一點爲你的答案的簡單性 – tiguero

+0

@Tobi恭喜,你贏了! =) – Ezeki

1

你說的是一樣的東西:

star0 = 1 
star1 = value & CHALLENGING || value & MODERATE 
star2 = value & CHALLENGING 
+0

是否確定它是不| |而不是|| ? – tiguero

+0

是的,這是一個常規的OR表達式。這與@ Tobi的答案中的'value&(MODERATE | CHALLENGING)'是一樣的。 –

19

在這種情況下,如果你想擁有3位,以節省您的星州,如代替有三個布爾標誌,不是你應該做的:

typedef enum 
{ 
    DifficultyEasy = 1 << 0, 
    DifficultyModerate = 1 << 1, 
    DifficultyChallenging = 1 << 2 
} Difficulty; 

Difficulty state = 0; // default 

要設置簡單:

state |= DifficultyEasy; 

要增加挑戰:

state |= DifficultyChallenging; 

要重置很簡單:

state &= ~DifficultyEasy; 

要知道是具有挑戰性的集:

BOOL isChallenging = DifficultyChallenging & state; 

在這種情況下有人需要它是如何工作的解釋:

1 << x means set x bit to 1 (from right); 
// actually it means move 0b00000001 left by x, but I said 'set' to simplify it 

1 << 5 = 0b00100000; 1 << 2 = 0b00000100; 1 << 0 = 0b00000001; 

0b00001111 | 0b11000011 = 0b11001111 (0 | 0 = 0, 1 | 0 = 1, 1 | 1 = 1) 

0b00001111 & 0b11000011 = 0b00000011 (0 & 0 = 0, 1 & 0 = 0, 1 & 1 = 1) 

~0b00001111 = 0b11110000 (~0 = 1, ~1 = 0) 
+0

你真的想得到那個複選標記嗎? :) – Tobi

+0

哈哈=)根本不知道,我只知道很多人不理解這個員工,所以也許他們會發現它稍後有用=) – Ezeki

+0

我知道你的意思。 :)幸運的是(可惜?)使用這個機會不會經常出現。 – Tobi

0
#define STAR0 1 
#define STAR1 2 
#define STAR2 4 

#define EASY STAR0 
#define MODERATE STAR1|STAR0 
#define CHALLENGING STAR0|STAR1|STAR2 

檢測值d與和和比較反對:0將產生所需的映射,上述的一些樣品給你映射的值來代替,一起來看看:

int d = EASY; 
    NSLog(@"Star 0 %d",(d&STAR0)!=0); 
    NSLog(@"Star 1 %d",(d&STAR1)!=0); 
    NSLog(@"Star 2 %d",(d&STAR2)!=0); 
    d=MODERATE; 
    NSLog(@"Star 0 %d",(d&STAR0)!=0); 
    NSLog(@"Star 1 %d",(d&STAR1)!=0); 
    NSLog(@"Star 2 %d",(d&STAR2)!=0); 
    d=CHALLENGING; 
    NSLog(@"Star 0 %d",(d&STAR0)!=0); 
    NSLog(@"Star 1 %d",(d&STAR1)!=0); 
    NSLog(@"Star 2 %d",(d&STAR2)!=0); 
+0

我討厭宏 - 它不是編譯器安全的 – tiguero

+0

好點,你是對的。但是,結果是一樣的。 – iOS

相關問題