J'ai le code Java suivant:
byte value = 0xfe; // corresponds to -2 (signed) and 254 (unsigned)
int result = value & 0xff;
Le résultat est 254 une fois imprimé, mais je n'ai aucune idée du fonctionnement de ce code. Si l' &
opérateur est simplement au niveau du bit, alors pourquoi ne produit-il pas un octet et plutôt un entier?
java
integer
byte
bitwise-and
dagronlund
la source
la source
byte value = (byte) 0xfe;
Réponses:
Il définit
result
la valeur (non signée) résultant de la mise des 8 bits devalue
dans les 8 bits les plus bas deresult
.La raison pour laquelle quelque chose comme cela est nécessaire est qu'il
byte
s'agit d'un type signé en Java. Si vous venez d'écrire:alors
result
finirait avec la valeurff ff ff fe
au lieu de00 00 00 fe
. Une autre subtilité est que le&
est défini pour n'opérer que sur lesint
valeurs 1 , donc ce qui se passe est:value
est promu enint
(ff ff ff fe
).0xff
est unint
littéral (00 00 00 ff
).&
est appliqué pour donner la valeur souhaitée pourresult
.(Le fait est que la conversion se
int
produit avant que l'&
opérateur ne soit appliqué.)1 Eh bien, pas tout à fait. L'
&
opérateur travaille également sur leslong
valeurs, si l'un des opérandes est unlong
. Mais pas surbyte
. Voir la spécification du langage Java, sections 15.22.1 et 5.6.2 .la source
0x
(ou0X
) indique à Java que le littéral entier qui suit doit être interprété comme hex (base 16). Java prend également en charge un0
préfixe nu pour les littéraux octaux et un préfixe0b
(ou0B
) pour les littéraux binaires. Consultez la spécification du langage Java pour plus d'informations sur les littéraux entiers.0x
ou0b
par lui-même (sans aucun chiffre) est une syntaxe illégale en Java.fe
en 8 bits, le complément à deux correspond à la valeur décimale -2. Pour conserver la valeur,Integer.valueOf(byte)
il faudrait produireff ff ff fe
(−2 en 32 bits, complément à deux), pas00 00 00 fe
(valeur décimale 254). Cette transformation (d'unebyte
valeurfe
à uneint
valeurff ff ff fe
) est connue sous le nom d'extension de signe et fait partie de la spécification du langage Java. Le but devalue & 0xff
est d'annuler l'extension de signe (c'est-à-dire de simuler une extension nulle, ce que Java n'a pas).De http://www.coderanch.com/t/236675/java-programmer-SCJP/certification/xff
Le littéral hexadécimal 0xFF est un entier égal (255). Java représente int comme 32 bits. Cela ressemble à ceci en binaire:
Quand vous faites un peu sage ET avec cette valeur (255) sur n'importe quel nombre, cela va masquer (faire des ZERO) tous sauf les 8 bits les plus bas du nombre (seront tels quels).
& est quelque chose comme% mais pas vraiment .
Et pourquoi 0xff? ceci dans ((puissance de 2) - 1). Tout ((puissance de 2) - 1) (par exemple 7, 255 ...) se comportera quelque chose comme l'opérateur%.
Alors
en binaire, 0 est, tous les zéros, et 255 ressemble à ceci:
Et -1 ressemble à ceci
Lorsque vous effectuez un ET au niveau du bit de 0xFF et toute valeur comprise entre 0 et 255, le résultat est exactement le même que la valeur. Et si une valeur supérieure à 255 reste, le résultat sera compris entre 0 et 255.
Cependant, si vous faites:
vous obtenez
00000000 00000000 00000000 11111111
, qui ne correspond PAS à la valeur d'origine de -1 (11111111
soit 255 en décimal).Vérifiez qu'un bit particulier est défini (1) ou non (0) puis
Définir (1) un bit particulier
ReSet (0) un bit particulier
XOR
Notez simplement que si vous effectuez l'opération XOR deux fois, la même valeur sera obtenue.
Une autre logique avec XOR est
Ce qui précède est utile pour permuter deux variables sans température comme ci-dessous
OU
la source
Cela aide à réduire beaucoup de codes. Il est parfois utilisé dans les valeurs RVB constituées de 8 bits.
où 0xff signifie 24 (0) et 8 (1) comme
00000000 00000000 00000000 11111111
Cela se voit le plus souvent dans des cas comme lors de la tentative de transformation des valeurs de couleur d'un format spécial en valeurs RVB standard (d'une longueur de 8 bits).
Grande explication Voir ici
la source
Dans le système au format 32 bits, la valeur hexadécimale
0xff
représente ce00000000000000000000000011111111
qui est255(15*16^1+15*16^0)
en décimal. et l'opérateur binaire & masque les 8 mêmes bits les plus à droite que dans le premier opérande.la source