Я видел, как другие использовали Bitwise-OR для объединения флагов раньше:
#define RUN 0x01
#define JUMP 0x02
#define SHOOT 0x04
const byte madPerson = RUN | JUMP | SHOOT;
Я тоже так делаю.
Но я также видел некоторые (не так много) флаги объединения, используя сложение:
#define RUN 0x01
#define JUMP 0x02
#define SHOOT 0x04
const byte madPerson = RUN + JUMP + SHOOT;
Какой из них более «читабелен»? (Как вы думаете, какой из них узнает больше людей?) Каков «стандартный» способ сделать это? Какой из них вы предпочитаете?
1<<0
,1<<1
,1<<2
и так далее. Когда у вас много флагов, он становится более читабельным, более легким в обслуживании, менее подверженным ошибкам. Например, если вы упаковываете все 64 бита 64-битного целого, вы действительно хотите избежать опечаток :) То, как вы представляете1
, также важно. Для 64-разрядного целого числа в VS2010 я думаю, что-то1UI64
, или что-то в этом роде. Использование неправильного типа может укусить вас.Ответы:
Побитовое ИЛИ.
Дополнение опасно.
Рассмотрим пример, где бандит - это человек, а злой бандит - это бандит, который говорит и стреляет. Позже вы решаете, что все бандиты должны стрелять, но вы забыли определение злого бандита и не снимаете флаг стрельбы.
Если бы вы использовали
angryBandit_add
свою игру, то теперь у вас была бы сбивающая с толку логическая ошибка из-за наличия злых бандитов, которые не могут стрелять или быть убиты.Если бы вы использовали
angryBandit_or
худшее, что у вас было бы, это избыточно| SHOOTS
.По тем же причинам побитовое НЕ безопаснее, чем вычитание для удаления флагов.
источник
побитовое ИЛИ передает намерение более четко
также побитовое ИЛИ должно быть более эффективным
источник