Bitwise-OR vs Aggiunta di flag

16

Ho visto che altri usano Bitwise-OR per combinare i flag prima:

#define RUN 0x01
#define JUMP 0x02
#define SHOOT 0x04

const byte madPerson = RUN | JUMP | SHOOT;

Questo è anche il modo in cui lo faccio.

Ma ho anche visto alcuni (non tanti) combinare i flag usando l'aggiunta:

#define RUN 0x01
#define JUMP 0x02
#define SHOOT 0x04

const byte madPerson = RUN + JUMP + SHOOT;

Quale è più "leggibile"? (Quale pensi che più persone riconosceranno?) Qual è il modo "standard" per farlo? Quale preferisci?

    
posta Mateen Ulhaq 05.12.2010 - 06:49
fonte

2 risposte

32

Bitwise-O.

L'aggiunta è pericolosa.

Considera un esempio in cui un bandito è una persona, e un bandito arrabbiato è un bandito che parla e spara. Più tardi, decidi che tutti i banditi dovrebbero sparare, ma ti sei dimenticato della definizione del bandito arrabbiato e non rimuovere la sua bandiera di tiro.

#define PERSON 1 << 0
#define SPEAKS 1 << 1
#define SHOOTS 1 << 2
#define INVINCIBLE 1 << 3
const byte bandit = PERSON | SHOOTS;                    // 00000101
const byte angryBandit_add = bandit + SPEAKS + SHOOTS;  // 00001011 error
const byte angryBandit_or = bandit | SPEAKS | SHOOTS;   // 00000111 ok

Se hai utilizzato angryBandit_add il tuo gioco ora avrà l'errore logico perplesso di avere banditi arrabbiati che non possono sparare o essere uccisi.

Se hai utilizzato angryBandit_or , il peggiore che avresti è un% ridondante di| SHOOTS.

Per motivi simili, NOT bit a bit è più sicuro della sottrazione per la rimozione dei flag.

    
risposta data 05.12.2010 - 09:00
fonte
11

bitwise-OR trasmette l'intento più chiaramente

anche, bitwise-OR dovrebbe essere più efficiente

    
risposta data 05.12.2010 - 06:53
fonte

Leggi altre domande sui tag