Code incompris

Messages postés
18
Date d'inscription
lundi 12 janvier 2009
Dernière intervention
20 mai 2018
-
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
Afficher la suite 

Votre réponse

2 réponses

Messages postés
12368
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
11 décembre 2018
0
Merci
Bonjour
C’est un décalage de bit avec insertion de 0.
https://emmanuel-delahaye.developpez.com/tutoriels/c/operateurs-bit-bit-c/
Commenter la réponse de Whismeril
Messages postés
15857
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
10 décembre 2018
0
Merci
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.
stealon
Messages postés
18
Date d'inscription
lundi 12 janvier 2009
Dernière intervention
20 mai 2018
-
Merci à KX et à Whismeril elles sont compléméntaires vos réponses et j'au vraiment compris. Merci encore.
Commenter la réponse de KX

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.