Предполагая, что у вас есть значения в виде независимых битов (степени двух), как:
#define IS_ON 0x01
#define IS_LARGE 0x02
#define IS_RED 0x04
(или эквивалентные enums
или const int
значения, в зависимости от того, как вы хотите их сделать - я использовал #define
просто потому, что это то, к чему я привык), вы можете pass их как:
funcname (IS_ON | IS_RED); // passes in 0x05
Тогда вы извлекаете что-то вроде:
void funcname (int bitmask) {
if ((bitmask & IS_ON) == IS_ON) { // 0x05 & 0x01 -> 0x01
// IS_ON bit is set.
}
:
}
Для однобитных спецификаторов вы можете обойтись без формы if (bitmask & IS_ON)
, но вам нужна полная проверка, могут ли ваши спецификаторы быть многоразрядными значениями (например, уровень громкости в трехбитах от 0 до 7, например) .