Code incompris

stealon Messages postés 17 Date d'inscription lundi 12 janvier 2009 Statut Membre Dernière intervention 20 mai 2018 - Modifié le 20 mai 2018 à 02:42
stealon Messages postés 17 Date d'inscription lundi 12 janvier 2009 Statut Membre Dernière intervention 20 mai 2018 - 20 mai 2018 à 23:23
Bonjour, j'ai besoin que quelqu'un m'explique ce code que j'ai vu dans une méthode hasCode(). Il se peut que c'est une casting mais je ne comprends pas. Le code est le suivant:

int hash = 7;
hash = 23 * hash + (int) (Double.doubleToLongBits(this.surfaceArea) ^ (Double.doubleToLongBits(this.surfaceArea) >>> 32));
// je na comprends pas ceci >>> 32

2 réponses

Whismeril Messages postés 19044 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 mai 2024 656
20 mai 2018 à 08:36
Bonjour
C’est un décalage de bit avec insertion de 0.
https://emmanuel-delahaye.developpez.com/tutoriels/c/operateurs-bit-bit-c/
0
KX Messages postés 16739 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 19 mai 2024 127
20 mai 2018 à 12:00
Bonjour,

Un double en Java est représenté en mémoire par 8 octets (64 bits).
Double.doubleToLongBits va récupérer chacun de ces bits et les stocker dans un long (64 bits aussi).
Par contre le hashCode attendu en Java est un int (4 octets = 32 bits).

x ^ (x >>> 32)
va permettre de faire un calcul entre les 32 premiers bits et les 32 derniers bits du long.
Le choix du
>>>
(au lieu de
>>
par exemple) étant de mettre à 0 les 32 premiers bits du long de résultat, ce qui permettra de ne garder que les 32 derniers bits et donc pouvoir le faire rentrer dans un int.

En simplifié (sur 16 bits), si tu as un nombre qui est représenté en interne par 10101010 11001100.
Le calcul qui est effectué c'est 10101010 ^ 11001100

Remarque : ton hashCode a été généré automatiquement par NetBeans. Et même si Eclipse fait plus ou moins pareil (mais avec 1 et 31 à la place des 7 et 23), ça ne veut pas dire que c'est la seule manière de faire.

La valeur exacte d'un hashCode pour un objet n'a aucune importance, ce qui compte ce sont ses propriétés :
  • si deux objets ont des hashCode différents alors ils sont différents
  • si deux objets sont égaux alors ils ont le même hashCode

Tu pourrais donc très bien faire ton propre calcul de hashCode, que tu comprendrais mieux, du moment que ces propriétés sont respectés. Exemple tout simple :
int hash = (int) surfaceArea;

Ce hashCode est tout à fait correct... mais il n'est pas "très bon" car il y aura souvent le même hashCode pour des objets différents, car on n'a pas pris en compte les nombres après la virgule.
0
stealon Messages postés 17 Date d'inscription lundi 12 janvier 2009 Statut Membre Dernière intervention 20 mai 2018
20 mai 2018 à 23:23
Merci à KX et à Whismeril elles sont compléméntaires vos réponses et j'au vraiment compris. Merci encore.
0
Rejoignez-nous