Widziałem wcześniej, jak inni używają Bitwise-OR do łączenia flag:
#define RUN 0x01
#define JUMP 0x02
#define SHOOT 0x04
const byte madPerson = RUN | JUMP | SHOOT;
Tak też to robię.
Ale widziałem także niektóre (nie tak wiele) łączące flagi przy użyciu dodawania:
#define RUN 0x01
#define JUMP 0x02
#define SHOOT 0x04
const byte madPerson = RUN + JUMP + SHOOT;
Który jest bardziej „czytelny”? (Jak myślisz, który z nich rozpozna więcej osób?) Jaki jest „standardowy” sposób na zrobienie tego? Który wolisz?
1<<0
,1<<1
,1<<2
i tak dalej. Gdy masz wiele flag, staje się bardziej czytelny, łatwiejszy w utrzymaniu, mniej podatny na błędy. Na przykład, jeśli pakujesz wszystkie 64 bity 64-bitowej int, naprawdę chcesz uniknąć literówek :)1
Ważne jest również to, jak reprezentujesz . Wydaje mi się, że dla 64-bitowej liczby całkowitej w VS2010 jest1UI64
coś takiego. Użycie niewłaściwego typu może cię ugryźć.Odpowiedzi:
Bitowe-LUB.
Dodawanie jest niebezpieczne.
Rozważ przykład, w którym bandytą jest osoba, a zły bandyta to bandyta, który mówi i strzela. Później decydujesz, że wszyscy bandyci powinni strzelać, ale zapomniałeś o definicji gniewnego bandyty i nie usuwaj flagi strzelania.
Gdybyś użył
angryBandit_add
swojej gry, miałby teraz kłopotliwy błąd logiczny posiadania wściekłych bandytów, którzy nie mogą strzelać ani zostać zabici.Jeśli użyłeś
angryBandit_or
najgorszego, co miałbyś, to zbędne| SHOOTS
.Z podobnych powodów bitowe NIE jest bezpieczniejsze niż odejmowanie do usuwania flag.
źródło
bitowe-LUB przekazuje intencję wyraźniej
również bitowe-LUB powinno być bardziej wydajne
źródło