2010-04-25 6 views
5

Dans un code je travaille sur je dois prendre soin de dix paramètres indépendants qui peuvent prendre l'une des deux valeurs (0 ou 1). Cela crée 2^10 conditions distinctes. Certaines des conditions ne se produisent jamais et peuvent être omises, mais celles qui se produisent sont encore beaucoup et faire un switch pour traiter tous les cas est fou. Je veux utiliser 10 if instructions au lieu d'un énorme switch. Pour cela, je sais que je devrais utiliser des bits de drapeau, ou plutôt des octets de drapeau comme la langue est javascript et il est plus facile de travailler avec une chaîne de 10 octets avec pour représenter un binaire de 10 bits.calcul et de détection de bits Drapeau

Maintenant, mon problème est, je ne sais pas comment implémenter cela. Je l'ai vu utilisé dans API s où de multiples options sélectionnables sont exposés avec des nombres 1, 2, 4, 8, ..., n^(n-1) qui sont équivalents décimaux de 1, 10, 100, 1000, etc. en binaire Donc, si nous faisons un appel comme bar = foo(7), la barre sera un objet avec toutes les options que les trois drapeaux les plus à droite permettent.

Je peux convertir le nombre décimal en binaire et dans chaque if contrôle d'instruction pour voir si le chiffre correspondant est défini ou non. Mais je me demande, est-il un moyen de déterminer le n-th chiffre d'un nombre décimal est égal à zéro ou un sous forme binaire, sans faire réellement la conversion?

Répondre

6

Il suffit d'utiliser Bitwise et. En C/C++, ce serait:

if (flags & 1) { 
    // Bit zero is set. 
} 
if (flags & 2) { 
    // Bit one is set. 
} 
if (flags & 4) { 
    // Bit two is set. 
} 
... 

Pour la bonté de production, utiliser des noms symboliques pour les masques de drapeau à la place des numéros magiques, 1, 2, 4, 8, etc.

Si les drapeaux sont homogènes d'une certaine façon (par exemple, ils représentent dix dimensions spatiales dans un problème de géométrie) et le code pour traiter chaque cas est le même, vous pouvez utiliser une boucle:

for (int f = 0; f < 10; ++f) { 
    if (flags & (1 << f)) { 
     // Bit f is set. 
    } 
} 
+0

WOW! Très rapide! Je voulais accepter votre réponse tout de suite, mais apparemment je devrais attendre au moins 9 minutes. Merci vraiment. –

+0

+1 tapait quelque chose de similaire mais vous étiez plus rapide;) –

1

vous pouvez obtenir un numéro qui a le n-ème bit et ET avec votre numéro. Si le résultat est zéro votre numéro n'a pas le bit défini. Sinon, ça l'a fait. Regardez here, aussi.

2

Vous pouvez utiliser Bitwise et:

10 & 2^1 is true because 10 = 1010b 
           ^1 
8 & 2^1 is false because 8 = 1000b 
           ^0 
10 & 2^3 is true because 10 = 1010b 
          ^1 
Questions connexes