在objective-c / c ++中反向位操作

时间:2013-08-05 09:11:45

标签: ios objective-c enums

我有相反的问题

如果我有:

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)有一种聪明的方法可以从枚举中删除这些值吗?

这是我的方法:

-(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
)

所以这是正确的。但也许有一些我不知道的方法允许我这样做,如果没有这个无意义的分配枚举数组等。

1 个答案:

答案 0 :(得分: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;
}