Вы можете использовать один бит внутри вашего int
для каждой конкретной камеры.Однако, если иметь дело с одиночными битами, unsigned int
предпочтительнее: если 32-битное целое число, 1 << 31
приводит к неопределенному поведению из-за целочисленного переполнения со знаком, так что вам придется жить с одним битом меньше или иметь некоторую специальную обработкудля идентификатора камеры 31 (при условии нулевого идентификатора):
unsigned int field;
// setting the bit for camera ID n (zero based):
field |= 1U << n;
// clearing the bit for camera ID n (zero based):
field &= ~(1U << n);
// reading the bit:
bool isSet = (field & ~(1U << n)) != 0;
(Конечно, вы бы упаковали это в соответствующие (встроенные?) функции ...)
Таким образом, вы можетеуправлять CHAR_BIT * sizeof(unsigned int)
камерами.В большинстве современных систем это будет 32 камеры - но это зависит от компилятора / архитектуры!Согласно стандарту, unsigned int гарантированно может содержать значения от 0 до 65535, поэтому для переносимости вы можете полагаться только на 16 бит (long
будет гарантировать 32 бита таким образом, но может быть больше, например64 бита на 64-битной Linux).Если вы хотите обеспечить определенное количество доступных битов, я рекомендую использовать типы данных из заголовка <cstdint>
, например, uint32_t
(чтобы быть уверенным, что литерал 1U имеет соответствующий диапазон, следует привести: static_cast<uint32_t>(1U)
или определитьконстанта соответствующего типа).
Обработка битов стоит несколько дополнительных операций, но они должны быть незначительными (за исключением некоторых очень редких, экстремальных сценариев производительности; встречаются такие только один единственныйопыт работы более 15 лет ...).
Еще одно замечание: вы можете обнаружить, что битовые поля скрывают биты от вас.Ну, конечно, они делают (но это все еще там, просто компилятор сделает все за вас).Но тогда у них есть и другие недостатки (самое важное: порядок членов не гарантируется, что они будут одинаковыми в разных системах, поэтому, если вы сериализуете их, например, в TCP или файлы, вы должны знать об этом!), Я лично предпочел бы избежатьих.Еще:
struct Field
{
uint32_t _0 : 1;
uint32_t _1 : 1;
// ...
uint32_t _31 : 1;
};