2013-08-05 2 views
0

У меня есть противоположный вопрос дляРеверс биты в Objective-C/C++

Если у меня есть:

typedef enum { 
    SUNDAY = (1 << 0), 
    MONDAY = (1 << 1), 
    TUESDAY = (1 << 2), 
    WEDNESDAY = (1 << 3), 
    THURSDAY = (1 << 4), 
    FRIDAY = (1 << 5), 
    SATURDAY = (1 << 6), 
} PFDateDays; 

И мой вход 65 например (SUNDAY,SATURDAY) есть умный способ для etract это значение из перечисление?

Вот мой метод:

-(NSMutableArray*)selectFromMyEnum { 
    NSMutableArray *returnArray = [[NSMutableArray alloc] init]; 
    int myInput = 62; 
    NSArray *enumArray = @[@(SATURDAY),@(FRIDAY),@(THURSDAY),@(WEDNESDAY),@(TUESDAY),@(MONDAY),@(SUNDAY)]; 
    for(NSNumber *numberInEnumArray in enumArray) { 
     if(myInput >= [numberInEnumArray integerValue]) { 
      [returnArray addObject:numberInEnumArray]; 
      myInput -= [numberInEnumArray integerValue]; 
     } 
    } 
    NSLog(@"%@",returnArray); 
    return returnArray; 
} 

И это вывод:

(
    64, //SATURDAY 
    1 //SUNDAY 
) 

Так что это правильно. Но, возможно, есть метод, о котором я не знаю, что позволяет мне делать это без этого бессмысленного присвоения enum массиву и т. Д.

ответ

3

Ну, первое, что приходит мне на ум, это. Так как ваше перечисление красиво выложено для отметки, вы можете сделать что-то вроде этого:

Начните с наивысшего значения перечисления (СУББОТА) и используйте поразрядное и (&), чтобы проверить, содержит ли ваше значение. Затем сдвиньте значение сравнения на 1 и повторите, пока ваше сравнительное значение не станет равным нулю.

PFDateDays comparison = SATURDAY; 

//If your enum doesn't end at 1 like the above example, 
//you could also use >= SUNDAY 
while(((int)comparison) > 0) { 
    if((myVal & comparison) == comparison) 
     //Do what you want, this value is valid 

    comparison = comparison >> 1; 
} 
+1

'if (myVal & сравнение) {...' сделаю. –

+0

@HermannKlecker True! На некоторых языках, которые не летают, это действительно моя привычка. Он также более прочный для проверки более одного флага одновременно. В этом случае, однако, вы правы. – borrrden

+0

Вот что я ищу! Спасибо! – Kuba