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 à l'impression, mais je n'ai aucune idée du fonctionnement de ce code. Si l'opérateur &
est simplement binaire, alors pourquoi ne résulte-t-il pas en un octet et en un entier?
Il définit result
sur la valeur (non signée) résultant de l'insertion des 8 bits de value
dans les 8 bits les plus bas de result
.
La raison pour laquelle quelque chose comme ceci est nécessaire est que byte
est un type signé en Java. Si vous venez d'écrire:
int result = value;
alors result
se retrouverait avec la valeur ff ff ff fe
au lieu de 00 00 00 fe
. Une autre subtilité est que le &
est défini pour ne fonctionner que sur les valeurs int
1Alors, que se passe-t-il?
value
est promu en int
(ff ff ff fe
).0xff
est un int
littéral (00 00 00 ff
).&
est appliqué pour générer la valeur souhaitée pour result
.(Le fait est que la conversion en int
se produit avant le l'opérateur &
est appliqué.)
1Pas tout à fait. L'opérateur &
fonctionne également sur les valeurs long
, si l'un des opérandes est un long
. Mais pas sur byte
. Voir la spécification du langage Java, sections 15.22.1 et 5.6.2 .
De http://www.coderanch.com/t/236675/Java-programmer-SCJP/certification/xff
Le littéral hexadécimal 0xFF est un égal égal (255). Java représente int en 32 bits. Cela ressemble à ceci en binaire:
00000000 00000000 00000000 11111111
Quand vous faites un peu sage ET avec cette valeur (255) sur n’importe quel nombre, il va masquer (créer des ZÉROs) tous sauf les 8 bits les plus bas du nombre (sera tel quel).
... 01100100 00000101 & ...00000000 11111111 = 00000000 00000101
& est quelque chose comme% mais pas vraiment .
Et pourquoi 0xff? ceci dans ((puissance de 2) - 1) . Tous ((puissance de 2) - 1) (par exemple 7, 255 ...) se comporteront comme% opérateur.
Ensuite
En binaire, 0 correspond à tous les zéros et 255 se présente comme suit:
00000000 00000000 00000000 11111111
Et -1 ressemble à ceci
11111111 11111111 11111111 11111111
Lorsque vous faites un bit AND de 0xFF et une valeur comprise entre 0 et 255, le résultat est identique à la valeur. Et si une valeur supérieure à 255 reste, le résultat sera compris entre 0 et 255.
Cependant, si vous le faites:
-1 & 0xFF
vous recevez
00000000 00000000 00000000 11111111
, qui n'égale PAS la valeur d'origine de -1 (11111111
est égal à 255 en décimal).
Peu plus de manipulation de bits: (Pas lié à la question)
X >> 1 = X/2
X << 1 = 2X
Vérifier qu'un bit particulier est activé (1) ou non (0), puis
int thirdBitTobeChecked = 1 << 2 (...0000100)
int onWhichThisHasTobeTested = 5 (.......101)
int isBitSet = onWhichThisHasTobeTested & thirdBitTobeChecked;
if(isBitSet > 0) {
//Third Bit is set to 1
}
Définir (1) un bit particulier
int thirdBitTobeSet = 1 << 2 (...0000100)
int onWhichThisHasTobeSet = 2 (.......010)
onWhichThisHasTobeSet |= thirdBitTobeSet;
ReSet (0) un bit particulier
int thirdBitTobeReSet = ~(1 << 2) ; //(...1111011)
int onWhichThisHasTobeReSet = 6 ;//(.....000110)
onWhichThisHasTobeReSet &= thirdBitTobeReSet;
XOR
Notez simplement que si vous effectuez l'opération XOR deux fois, la même valeur sera obtenue.
byte toBeEncrypted = 0010 0110
byte salt = 0100 1011
byte encryptedVal = toBeEncrypted ^ salt == 0110 1101
byte decryptedVal = encryptedVal ^ salt == 0010 0110 == toBeEncrypted :)
Une autre logique avec XOR est
if A (XOR) B == C (salt)
then C (XOR) B == A
C (XOR) A == B
Ce qui précède est utile pour échanger deux variables sans temp comme ci-dessous
a = a ^ b; b = a ^ b; a = a ^ b;
OR
a ^= b ^= a ^= b;
Cela aide à réduire beaucoup de codes. Il est parfois utilisé dans des valeurs RVB composées de 8 bits.
où 0xff signifie 24 (0) et 8 (1) comme 00000000 00000000 00000000 11111111
Il masque effectivement la variable, de sorte qu'il ne laisse que la valeur dans les 8 derniers bits et ignore tout le reste des bits.
C’est ce qui se produit le plus souvent dans les cas de tentative de transformation des valeurs de couleur d’un format spécial en valeurs RVB standard (d’une longueur de 8 bits).
Dans un système au format 32 bits, la valeur hexadécimale 0xff
représente 00000000000000000000000011111111
et 255(15*16^1+15*16^0)
en décimal. et l'opérateur au niveau des bits & masque les 8 bits les plus à droite comme dans le premier opérande.