0

私は反対の質問があります

私が持っている場合:

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
)

したがって、これは正しいです。しかし、この無意味な配列への列挙型の割り当てなどを行わずにこれを行うことができる、私が知らない方法があるかもしれません..

4

1 に答える 1

3

さて、真っ先に思い浮かぶのはこれ。あなたの列挙型はフラグを立てるためにうまくレイアウトされているので、次のようなことができます:

最も高い列挙値 (SATURDAY) から開始し、ビットごとの and ( &) を使用して、値に含まれているかどうかを確認します。次に、比較値を右に 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;
}
于 2013-08-05T09:18:27.070 に答える