5

難易度を表す 3 つの星をオン/オフしたいと考えています。複数のif条件を使いたくないのですが、ビット単位演算だけで可能でしょうか?

次のような列挙型を宣言したとしましょう:

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
4

4 に答える 4

20

星の状態を保存するために 3 つのビットが必要な場合は、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)
于 2012-10-25T21:33:36.550 に答える
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);
}
于 2012-10-25T21:29:21.593 に答える
1

あなたは次のようなことについて話しているのですか:

star0 = 1
star1 = value & CHALLENGING || value & MODERATE
star2 = value & CHALLENGING
于 2012-10-25T21:13:33.657 に答える
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);
于 2012-10-25T21:40:15.720 に答える