Альтернативный вариант коммутатора для проверки подмножества битов в наборе опций? - PullRequest
0 голосов
/ 25 сентября 2018

У меня есть набор параметров, который я использую для эффективного хранения различной информации об объекте.Т.е. первые 6 или около того битов определяют «тип», а несколько битов определяют, находится ли он в определенных состояниях, которые могут или не могут быть взаимоисключающими.

У меня было все это как один большой набор опций,Я знаю, что одним из вариантов реализации для меня было бы вернуться и переработать его в отдельные перечисления.Увы, это было бы намного сложнее, и мне действительно понравился один int, который нужно было сохранить для хранения всей этой информации.

В настоящее время я не могу использовать регистр переключения, потому что значениередко соответствует одному варианту.Я хочу быть в состоянии сделать случай переключателя на части типа, и отдельный случай переключателя на частях состояния.Но единственной реализацией, которую я смог найти, была какая-то уродливая цепочка if / else.

Есть ли какая-то другая операция, которую я, возможно, упускаю, которая может выполнить это лучше?

1 Ответ

0 голосов
/ 25 сентября 2018

Итак, во время ввода вопроса у меня случился взрыв мозга, но, поскольку я впервые провел некоторые поиски и не нашел ничего полезного, я подумал, что все равно опубликую.

Это работает, только если выпытаемся проверить взаимоисключающее подмножество опций.Т.е. я упомянул, что мои первые несколько битов определяют тип или категорию.В пределах определения наборов опций у вас есть возможность определить некоторые другие значения.Здесь я добавляю опцию 'allTypes', которая охватывает все биты, определяющие типы.

typedef NS_OPTIONS(NSInteger, kPropertyState) {
    kTypeNone                            = 0,
    kType1                               = 1,
    kType2                               = 1 << 1,
    kType3                               = 1 << 2,
    kState1                              = 1 << 3,
    kState2                              = 1 << 4,
// ... ... ...
    kAllTypes                            = kType1 | kType2 | kType3
};

Затем, когда я хочу выполнить проверку регистра переключателя для типа, я могу сделать это:

kPropertyState propertyState = // ... Однако это было получено

switch( propertyState & .kAllTypes ) {
    case kType1: // ...
    case kType2: // ...
    case kType3: // ...
    default: // . . .
}

Просто используйте побитовый код и изолируйте биты.Поскольку эти биты являются взаимоисключающими друг от друга, вам не нужно беспокоиться о других битах, отбрасывающих проверки регистра.Кроме того, помещая побитовое и внутри оператора switch, мой propertyState фактически не изменяется, и у меня все еще есть доступ к другим битам состояния внутри соответствующих блоков case.

...