Comprendre la valeur & 0xff en Java

1. Vue d'ensemble

0xff est un nombre représenté dans le système numérique hexadécimal (base 16). Il est composé de deuxnombres F en hexadécimal. Comme nous le savons, F en hexadécimal équivaut à 1111 dans le système numérique binaire. Donc, 0xff en binaire est 11111111.

Dans cet article, nous découvrirons comment utiliser la valeur 0xff . De plus, nous verrons comment le représenter à l'aide de plusieurs types de données et comment l'utiliser avec l' opérateur & . Enfin, nous passerons en revue certains des avantages associés à son utilisation.

2. Représenter 0xff avec différents types de données

Java nous permet de définir des nombres interprétés comme hexadécimaux (base 16) en utilisant le préfixe 0x , suivi d'un littéral entier.

La valeur 0xff équivaut à 255 en décimal non signé, -127 en décimal signé et 11111111 en binaire.

Donc, si nous définissons une variable int avec une valeur de 0xff , puisque Java représente des nombres entiers utilisant 32 bits , la valeur de 0xff est 255 :

int x = 0xff; assertEquals(255, x);

Cependant, si nous définissons une variable d' octet avec la valeur 0xff , puisque Java représente un octet utilisant 8 bits et qu'un octet est un type de données signé , la valeur de 0xff est -1 :

byte y = (byte) 0xff; assertEquals(-1, y);

Comme nous le voyons, lorsque nous définissons une variable d' octet avec la valeur 0xff , nous devons la réduire à un octet car la plage du type de données octet est comprise entre -128 et 127 .

3. Utilisation courante de l' opération & 0xff

L' opérateur & effectue une opération AND au niveau du bit . La sortie de ET au niveau du bit est 1 si les bits correspondants de deux opérandes sont 1. Par contre, si l'un des bits des opérandes est 0, alors le résultat du bit correspondant est évalué à 0.

Puisque 0xff en a huit dans les 8 derniers bits , il en fait un élément d'identité pour l'opération AND au niveau du bit . Donc, si nous appliquons l' opération x & 0xff , cela nous donnera les 8 bits les plus bas de x . Notez que si le nombre x est inférieur à 255, ce sera toujours le même. Sinon, ce seront les 8 bits les plus bas de x .

En général, l' opération & 0xff nous fournit un moyen simple d'extraire les 8 bits les plus bas d'un nombre . Nous pouvons en fait l'utiliser pour extraire les 8 bits dont nous avons besoin, car nous pouvons décaler vers la droite n'importe lequel des 8 bits que nous voulons être les bits les plus bas. Ensuite, nous pouvons les extraire en appliquant l' opération & 0xff .

Voyons un exemple pour expliquer plus en détail certains des avantages de l'utilisation de & 0xff .

4. Extraction des coordonnées de couleur RGBA à l'aide de & 0xff

Supposons que nous ayons un nombre entier x , stocké sur 32 bits, qui représente une couleur dans le système RGBA, ce qui signifie qu'il a 8 bits pour chaque paramètre (R, V, B et A):

  • R = 16 (00010000 en binaire)
  • G = 57 (00111001 en binaire)
  • B = 168 (10101000 en binaire)
  • A = 7 (00000111 en binaire)

Ainsi, x en binaire serait représenté par 00010000 00111001 10101000 00000111 - ce qui équivaut à 272214023 en décimal.

Maintenant, nous avons notre valeur x en décimal et nous voulons extraire la valeur de chaque paramètre.

Comme nous le savons, l'opération >> décale les bits vers la droite. Par conséquent, lorsque nous faisons (10000000 00000000 >> 8), cela nous donne 10000000. En conséquence, nous pouvons extraire la valeur de chaque paramètre :

int rgba = 272214023; int r = rgba >> 24 & 0xff; assertEquals(16, r); int g = rgba >> 16 & 0xff; assertEquals(57, g); int b = rgba >> 8 & 0xff; assertEquals(168, b); int a = rgba & 0xff; assertEquals(7, a);

5. Conclusion

Dans ce didacticiel, nous avons expliqué comment l' opération & 0xff divise efficacement une variable d'une manière qui ne laisse que la valeur dans les 8 derniers bits et ignore le reste des bits. Comme nous l'avons vu, cette opération est particulièrement utile lorsque nous décalons vers la droite une variable et que nous devons extraire les bits décalés.

Comme toujours, le code présenté dans cet article est disponible à l'adresse over sur GitHub.