2013-08-05 44 views
0

我有反向位操作/ 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 
) 

因此,這是正確的。但也許有我不知道的方法,讓我這樣做,沒有這個毫無意義的分配枚舉數組等等..

回答

3

那麼我想到的第一件事是這樣的。由於你的枚舉很好地佈置爲標記,所以你可以這樣做:

從你的最高枚舉值(SATURDAY)開始並使用按位和(&)來檢查你的值是否包含它。然後將比較值右移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&comparison){...'would do。 –

+0

@HermannKlecker真實!在某些不能飛行的語言中,這實際上只是我的習慣。這對於一次檢查多個標誌也更加穩健。但在這種情況下,你是對的。 – borrrden

+0

這就是我要找的!謝謝! – Kuba