3 votes

Combinaison hexadécimale de drapeaux binaires

Quel(s) des éléments suivants renvoie(nt) 63 en tant que long (en Java) et comment ?

0x0
0x1
0x2
0x4
0x8
0x10
0x20

Je travaille avec les indicateurs de l'API NetworkManager si cela peut aider. Je reçois 63 à partir d'une des opérations mais je ne sais pas comment je devrais faire correspondre la valeur de retour à la description.

Merci

20voto

Eli Bendersky Points 82298

63 est 32 | 16 | 8 | 4 | 2 | 1, où | est l'opérateur ou binaire.

Ou en d'autres termes (en hex): 63 (qui est 0x3F) est 0x20 | 0x10 | 0x8 | 0x4 | 0x2 | 0x1. Si vous les regardez tous en binaire, c'est évident:

0x20 : 00100000
0x10 : 00010000
0x08 : 00001000
0x04 : 00000100
0x02 : 00000010
0x01 : 00000001

Et 63 est:

0x3F : 00111111

Si vous obtenez un certain statut de retour et que vous voulez savoir ce qu'il signifie, vous devrez utiliser et binaire. Par exemple:

if (statut & 0x02) 
{
}

Exécutera si le drapeau 0x02 (c'est-à-dire, le 2e bit à partir de la droite) est activé dans le statut retourné. Le plus souvent, ces drapeaux ont des noms (descriptions), donc le code ci-dessus ressemblera à:

if (statut & CONNECT_ERROR_FLAG)
{
}

Encore une fois, le statut peut être une combinaison de choses:

// Vérifie si les deux drapeaux sont définis dans le statut
if (statut & (CONNECT_ERROR_FLAG | WRONG_IP_FLAG))
{
}

P.S. : Pour apprendre pourquoi cela fonctionne, cet est un bel article sur les drapeaux binaires et leurs combinaisons.

2voto

stakx Points 29832

Je vous donnerais la même réponse que Chris : votre valeur de retour 0x63 semble être une combinaison de tous les drapeaux que vous mentionnez dans votre liste (à l'exception de 0x0).

Lorsque vous traitez avec des drapeaux, une façon facile de déterminer à la main quels drapeaux sont définis est de convertir tous les nombres en leur représentation binaire. C'est particulièrement facile si vous avez déjà les nombres en hexadécimal, puisque chaque chiffre correspond à quatre bits. Tout d'abord, votre liste de nombres :

   0x01           0x02           0x04        ...        0x20
    |              |              |                      |
    |              |              |                      |
    V              V              V                      V
0000 0001      0000 0010      0000 0100      ...     0010 0000

Maintenant, si vous prenez votre valeur 63, qui est 0x3F (= 3 * 161 + F * 160, où F = 15) en hexadécimal, cela devient :

   0x3F
    |
    |
    V
0011 1111

Vous voyez rapidement que les 6 bits les plus bas sont tous définis, ce qui est une combinaison "additive" (OU logique) des nombres binaires ci-dessus.

1voto

Chowlett Points 19889

63 (décimal) équivaut à 0x3F (hexadécimal). Donc, 63 est une combinaison de tous les drapeaux suivants :

0x20
0x10
0x08
0x04
0x02
0x01

Est-ce ce que vous cherchiez ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X