Эффективность кодирования со сдвигом битов (т.е. аккуратные приемы) - PullRequest
3 голосов
/ 15 августа 2011

Я работаю над программой Objective-C, где я получаю битовые поля по сети, и мне нужно установить логические переменные на основе этих битов.

В настоящее время я представляю битовые поля как int, а затем использую битовое смещение, подобное этому (все свойства self являются BOOL):

typedef enum {
    deleteFlagIndex = 0,
    uploadFlagIndex = 1,
    moveFlagIndex = 2,
    renameFlagIndex = 3
} PrivilegeFlagIndex;

int userFlag = 5; //for example

// this would be YES
self.delete = ((userFlag & (1 << deleteFlagIndex)) == (1 << deleteFlagIndex));
// this would be NO
self.upload = ((userFlag & (1 << uploadFlagIndex)) == (1 << uploadFlagIndex));

И это работает (насколько мне известно), но я задаюсь вопросом - есть ли более эффективный краткий способ кодировать все биты, используя причудливый трюк / хак? Я спрашиваю, потому что я буду делать это для много флагов (более 30).

Я понял, что мог бы также использовать этот метод:

self.move = ((userFlag & (1 << moveFlagIndex)) > 0)

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

Редактировать: Пересмотрено, чтобы сказать кратким, а не эффективным - я не беспокоился о производительности выполнения, а скорее советы и лучшие практики для того, чтобы сделать это умным способом.

Ответы [ 2 ]

11 голосов
/ 15 августа 2011

Попробуйте:

typedef enum {
    deleteFlag = 1 << 0,
    uploadFlag = 1 << 1,
    moveFlag = 1 << 2,
    renameFlag = 1 << 3
} PrivilegeFlags;

Теперь вы можете комбинировать их, используя | напрямую.

Обычно достаточно сравнить с 0:

if (userFlag & deleteFlag) {
    // delete...
}
0 голосов
/ 15 августа 2011

Вы можете попробовать использовать битовые поля и позволить компилятору выполнить оптимизацию самостоятельно.

...