Complément de 2 hex de nombre à virgule en java
J'ai une chaîne hexadécimale qui représente un complément de 2 numéro. Est-il un moyen facile (bibliothèques de fonctions) pour traduire l'hexadécimal en décimal sans travailler directement avec ses bits??
E. G. C'est la sortie attendue compte tenu de l'hexagone sur la gauche:
"0000" => 0
"7FFF" => 32767 (max positive number)
"8000" => -32768 (max negative number)
"FFFF" => -1
Merci!
Si vous savez comment faire pour obtenir un nombre non signé puis il suffit de soustraire 65536 si la valeur est plus grande que 32767
Au début, j'ai dit Entier.parseInt mais alors rendu compte de son 2 du compliment. J'ai donc enlevé ma réponse.
Au début, j'ai dit Entier.parseInt mais alors rendu compte de son 2 du compliment. J'ai donc enlevé ma réponse.
OriginalL'auteur Gevorg | 2011-07-14
Vous devez vous connecter pour publier un commentaire.
Cela semble truc java en convertissant le nombre sans forcer un résultat positif:
Bien sûr, ce genre de chose ne fonctionne que pour 8, 16, 32 et 64 bits complément de 2:
Exemple ici.
Je suis assez sûr que la conversion à une faible précision type de garde simplement le plus bas bits, ce qui était un
0000FFFF
int
devient unFFFF
short
. De mêmeInteger.valueOf("A7FFFF",16).shortValue();
aurait également-1
-- les bits supérieurs sont juste à couper.Vous avez probablement raison. Pourtant, je ne pas bien comprendre pourquoi le signe de commutateurs pour la négative lors de la conversion pour une précision inférieure... Cela dépend probablement sur la manière dont les nombres sont stockés en interne, j'ai peut-être besoin de faire quelques recherches sur ce..
En fait, c'est spécifié dans java.sun.com/docs/books/jls/second_edition/html/...
En particulier "Un rétrécissement de la conversion d'un entier signé intégrante de type T supprime simplement les tous, mais le n le plus bas de l'ordre de bits, où n est le nombre de bits utilisés pour représenter le type de T. En plus d'une possible perte d'information sur l'ampleur de la valeur numérique, cela peut entraîner le signe de la valeur obtenue à différer le signe de la valeur d'entrée."
OriginalL'auteur trutheality
Il suffit d'écrire une méthode utilitaire:
Tests:
+1 Ressemble, il serait assez facile de rouler dans un BigInteger mise en œuvre pour l'ultime évolutivité.
simple et clair, merci! @trutheality est sorti avec un peu de magie ...
OriginalL'auteur Mark Elliot
Cela semble fonctionner raisonnablement bien. Il peut être trompé par le passage de la non-standard de la longueur des chaînes: "FFF" cartes à -1. Zéro de remplissage de corriger l'anomalie.
Vous n'êtes pas clair sur ce type de retour que vous souhaitez, j'ai donc retourné
Number
, à n'importe quelle taille est appropriée.Exemple de sortie:
System.out.println(new BigInteger("33333333", 16).intValue()+" -> "+53687091);
OriginalL'auteur rossum