Que signifie «(int) valeur & 0x1, (int) valeur & 0x2, (int) valeur & 0x4, (int) valeur & 0x8» signifie? "

11

code

La "valeur" va de 0 à 15 (ses valeurs possibles). Quand ces 4 conditions «si» seront-elles remplies? Si ma valeur (int) = 2, cela signifie-t-il 0010?

            if  ((int)value & 0x1) 
            {
                //statement here
            }
            if  ((int)value & 0x2) 
            {
                //statement here
            }
            if  ((int)value & 0x4) 
            {
                //statement here
            }
            if  ((int)value & 0x8) 
            {
                //statement here
            }
Sean McCarthy
la source
3
Ce sont des masques de bits vérifiant les bits individuels de value(lire if(value & 0x4)comme "Est le 3ème bit de l' valueensemble (= 1)). Comme vous avez apparemment des problèmes pour comprendre le code, je suppose que ce n'est pas le vôtre. Ceci (et le fait que vous ne demandez pas pour examen) rend cette question hors sujet pour CR.SE .
Personne
Pour une meilleure compréhension, un code similaire qui a été porté en C # utilisera la Enum.HasFlagméthode pour tester les bits. Voir: Enum.HasFlag .
rwong

Réponses:

12

Chaque nombre peut être exprimé comme value = b0*2^0 + b1*2^1 + b2*2^2 + b3*2^3 + ...chaque b étant soit 0ou 1(ce sont les bits de la représentation). Ceci est la représentation binaire.

Le AND binaire ( &) prend chacune de ces bpaires sage et effectue AND sur elles. Cela a les sorties suivantes:

0 & 0 = 0
0 & 1 = 0
1 & 0 = 0
1 & 1 = 1

En utilisant des puissances de 2 (qui n'ont qu'un seul bit activé), nous pouvons isoler et tester les bits individuels:

  • value & 1est vrai quand valueest impair {1, 3, 5, 7, 9, 11, 13, 15}.

  • value & 2est vrai quand value/2est impair {2, 3, 6, 7, 10, 11, 14, 15}.

  • value & 4est vrai quand value/4est impair {4, 5, 6, 7, 12, 13, 14, 15}.

  • value & 8est vrai quand value/8est impair {8, 9, 10, 11, 12, 13, 14, 15}.

Le préfixe 0x sur les nombres signifie qu'il doit être interprété comme un nombre hexadécimal . C'est un peu superflu lorsque vous ne montez qu'à 0x8 mais informe les responsables qu'il est probablement utilisé comme masque de bits.

monstre à cliquet
la source
1
Le libellé peut suggérer qu'il peut être étendu à tous les nombres, ce qui n'est pas vrai: 8/6est impair, alors qu'il 8&6donne faux.
Sjoerd
@Sjoerd c'est pourquoi j'ai dit "pouvoirs de 2"
ratchet freak
5

Ces instructions if vérifient si un bit spécifique de valueest défini.

La valeur hexadécimale 0x4, par exemple, a le 3ème bit du jeu de droite à 1et tous les autres bits de la valeur 0. Lorsque vous utilisez l'opérateur binaire et ( &) avec deux opérateurs, le résultat aura tous les bits définis à l' 0exception des bits qui sont 1 dans les deux opérateurs.

Ainsi, lorsque vous effectuez le calcul value & 0x4, vous obtenez soit binaire 00000000soit binaire 00000100, selon que le 3e bit de valueest 1ou non 0. Le premier est évalué à false, et le second à true, de sorte que le bloc if n'est exécuté que pour les valeurs où le 3e bit est défini.

Philipp
la source
1

Il y a deux choses intéressantes à noter ici.

Tout d'abord, il s'agit d'un modèle commun pour vérifier chacun des 4 bits de poids faible d'une valeur intégrale. La condition if est remplie si le bit correspondant est activé. Pour la valeur 2, la configuration binaire est bien 0010.

L'autre question plus intéressante est pourquoi le (int)casting? Mis à part le mauvais style d'utilisation des transtypages C en C ++, aucune valeur entière ou de caractère ne nécessite cette conversion. Un bool n'a aucun sens, un double / float serait converti en un entier temporaire et il serait inhabituel d'utiliser des valeurs littérales pour tester une énumération. Cela pourrait avoir un sens avec un pointeur, mais ce serait une utilisation très spécialisée. Conclusion: le casting n'a aucun sens.

david.pfx
la source