Битовые флаги - проверьте, установлены ли какие-либо из определенных флагов (и никаких других) - PullRequest
0 голосов
/ 13 февраля 2019

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

CMD_NONE = 0x0,
CMD_TELEPORT = 0x1,
CMD_VIP = 0x2,
CMD_NO_LOG = 0x4, // don't log the execution of this command

И что я хочу сделать, это сделать несколько функций / макросов, чтобы упростить вещи, потому что я хочу проверить, скажем, команда установила CMD_TELEPORT или CMD_VIP и ничего больше, поэтому и CMD_TELEPORT, и CMD_VIP являются необязательными и могут быть включены или выключены, но что-либо еще нельзя включить одновременно.

Пока что я проверял это вручную, но это задница.Я не могу использовать

if (flags == (CMD_TELEPORT | CMD_VIP)

, потому что он проверяет, установлены ли одновременно оба флагов, и я хочу, чтобы они были фактически единственными флагами, которые может быть установленным, но не обязательно одновременно.Так что это либо CMD_NONE, CMD_TELEPORT, CMD_VIP, либо (CMD_TELEPORT | CMD_VIP)

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

1 Ответ

0 голосов
/ 13 февраля 2019

Если вы хотите проверить, что не установлен ни один другой бит, кроме CMD_TELEPORT или CMD_VIP, вы можете замаскировать их и посмотреть, является ли результат ненулевым:

if (flags & ~(CMD_TELEPORT|CMD_VIP)) {
    /* something else is set */
} else {
    /* just TELEPORT or VIP, or both, or nothing */
}

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

...