2013-08-05 42 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