-
pb Et bit à bit
Bonjour, je voudrais savoir à quoi sert cette opération & 0xffffffff, j 'ai lu que c'était censé rendre un nombre signé, non-signé.
Par contre, quand je le teste ça ne change rien
int res = -2 &0xffffffff;
res est égal à -2.
Est-ce que je me trompe en l'exécutant ? Qu'elle est sa véritable fonction ?
-
oui c'est juste mais il faut faire attention à la taille des types
par defaut, java utilise des int (taille: 4 bytes)
vu que ton masque est aussi sur 4 bytes (0xffffffff), tu dois utiliser un type plus grand pour ta conversion: long (taille: 8 bytes)
Code:
long res = -2L &0xffffffffL;
sinon, utilise un masque plus petit
-
Ok merci pour ta réponse, je n'ai pas tout saisi cette histoire de masque plus grand, je vais essayer de me renseigner plus amplement afin de mieux saisir.
-
avec un int, ça n'a aucun effet, c'est une opération neutre.
avec un long (64 bit), ca a pour effet de ne garder que les 32 bits de poids faible. ça annulera donc le bit de signe sur le Long. Combiné à la règle de promotion int -> long ça aura pour effet final de récupérer la valeur en non signé.
Prenons un exemple
Soit l'entier 0xf0000000, qui vaut 4026531840 en arithmétique non signée mais en arithmétique signée (donc dans un int)vaut -268435456
Convertis en long, ça donne 0xfffffffff0000000, qui conserve la veleur signée de -268435456. Lorsque, dans un deuxième temps j'applique le masque, j'obtiens comme long 0x00000000F0000000, soit au final la réprésentation binaire de départ du int, mais dans un long. Sa valeur signée est alors 4026531840.
Au final, l'opération
((long)entier) & 0xFFFFFFFFL a pour effet de promouvoir l'entier en long en le considérant comme non signé (préservation des bits de départ).