Je vais être plus explicite ici parce que je pense que les masques bitwise sont un outil formidable qui devrait être à la portée de tout développeur. Je vais essayer de développer les réponses ci-dessus. Tout d'abord, un exemple d'utilisation d'un entier pour maintenir des drapeaux d'état (usage courant) :
// These are my masks
private static final int MASK_DID_HOMEWORK = 0x0001;
private static final int MASK_ATE_DINNER = 0x0002;
private static final int MASK_SLEPT_WELL = 0x0004;
// This is my current state
private int m_nCurState;
A set mon état, j'utilise l'opérateur OR bitwise :
// Set state for'ate dinner' and 'slept well' to 'on'
m_nCurState = m_nCurState | (MASK_ATE_DINNER | MASK_SLEPT_WELL);
Remarquez comment je "ou" mon état actuel avec les états que je veux "allumer". Qui sait quel est mon état actuel et je ne veux pas le faire disparaître.
A non activé Dans mon état, j'utilise l'opérateur ET binaire avec l'opérateur de complément :
// Turn off the 'ate dinner' flag
m_nCurState = (m_nCurState & ~MASK_ATE_DINNER);
A vérifier mon état actuel, j'utilise l'opérateur AND :
// Check if I did my homework
if (0 != (m_nCurState & MASK_DID_HOMEWORK)) {
// yep
} else {
// nope...
}
Pourquoi est-ce que je pense que c'est intéressant ? Disons que je conçois une interface qui définit mon état. Je pourrais écrire une méthode qui accepte trois booléens :
void setState( boolean bDidHomework, boolean bAteDinner, boolean bSleptWell);
Ou bien, je pourrais utiliser un seul nombre pour représenter les trois états et transmettre une seule valeur :
void setState( int nStateBits);
Si vous choisissez le deuxième modèle, vous serez très heureux lorsque vous déciderez d'ajouter un autre état - vous n'aurez pas à casser les impls existants de votre interface.
Mes deux centimes. Merci.