Bit-à-bit “& ” sur une longue?
Je veux obtenir le moins de 32 bits à partir d'un nombre de type long, donc j'ai effectuer l'opération au niveau du bit "&" sur le nombre de bits du masque 0xFFFFFFFF, mais le résultat n'est pas correct, il contient toujours les autres bits.
par exemple:
long a = 0x1234567890ab;
long b = (a & 0xffffffff);
J'attends la valeur de b à 0x567890ab
mais dans la pratique, il est toujours 0x1234567890ab
- En tant que programmeur C (+25 ans), je suis habitué à utiliser unsigned variables afin d'éviter l'extension du signe de questions, mais dans ce cas je devrais avoir enseignée à ajouter le L à la fin de mon littérale. Je suis en train d'apprendre le java et je vais probablement tomber dans certains autres pièges :o)
- Putain de bonne question. Je viens de tomber sur ce et la réponse a été tout à fait une surprise. Est-ce un manque de Java casse-têtes? 🙂
Vous devez vous connecter pour publier un commentaire.
Essayez ceci:
0xffffffff
est un littéral de typeint
, pour la réalisation de&
aveclong
il est promu typelong
par l'extension du signe, par conséquent, il se transforme en0xffffffffffffffff
. Pour éviter l'extension du signe vous devez l'écrire comme un littéral de typelong
:0xffffffffL
.Ne l'aide 0xffffffffL faire une différence?
Je pense que ce qui se passe est que 0xffffffff obtient upcasted pour une longue, et depuis deux int et long sont signés il essaie de garder le même signe.
Donc, depuis 0xffffffff valeur est -1 comme un int, il est converti en -1 comme une longue, ou 0xffffffffffffffff
essayer de faire un bit à bit ET avec une valeur de type long avec quelques zéros au lieu d'une valeur 32 bits. maintenant vous avez l'impression de ne rien faire pour le nombre.