Java11
Ce n'est pas un gros problème, alors je vais tout à coup entrer dans le sujet principal.
En Java, les nombres négatifs sont représentés en interne par le complément de 2. Vous pouvez utiliser Integer.toBinaryString () pour obtenir une chaîne avec une représentation interne.
Dans le cas d'un nombre binaire, le complément de 2 est le nombre obtenu en inversant tous les bits puis en ajoutant 1. Puisque le nombre décimal 15 est 1111 dans le nombre binaire, le nombre décimal -15 est la valeur suivante.
System.out.println(Integer.toBinaryString(-15)) // 11111111111111111111111111110001
Cependant, passer cette valeur à Integer.parseInt () entraînera une erreur.
Integer.parseInt(Integer.toBinaryString(-15), 2)
//Exception java.lang.NumberFormatException: For input string: "11111111111111111111111111110001"
// at NumberFormatException.forInputString (NumberFormatException.java:65)
// at Integer.parseInt (Integer.java:652)
// at (#9:1)
Apparemment, vous devez passer Integer.parseInt () sous la forme d'un nombre binaire positif avec un signe négatif, plutôt que la valeur de la représentation interne du complément 2.
System.out.println(Integer.parseInt("-1111", 2)) // -15
c'est tout.
PostScript 2019/3/4 Vous en avez souligné certains dans les commentaires.
https://docs.oracle.com/javase/jp/8/docs/api/java/lang/Integer.html#toBinaryString-int-
Renvoie la représentation sous forme de chaîne de l'argument entier sous la forme d'un entier non signé de base 2. La valeur int non signée est l'argument plus 2 ^ 32 si l'argument est un nombre négatif.
(La partie qui devient 232 lorsqu'elle est copiée telle quelle est corrigée à 2 ^ 32)
Il a été déclaré que si l'argument est une valeur négative, une représentation interne du complément 2 est renvoyée, mais le document officiel semble avoir la description ci-dessus. Cependant, le résultat est le même. Je l'ai vérifié en utilisant Ruby. (Parce que Java déborde et est gênant)
Tout d'abord, la valeur de retour de Integer.toBinaryString () de Java
System.out.println(Integer.toBinaryString(-15)); // 11111111111111111111111111110001
Représentation binaire de la valeur de l'argument (-15) plus 2 ^ 32
n = -15 + 2 ** 32
puts(n.to_s(2)) # 11111111111111111111111111110001
Il a été confirmé que les deux sont devenus 11111111111111111111111111110001.
En outre, il semble y avoir une méthode appelée Integer.parseUnsignedInt () qui peut analyser ce nombre binaire interne tel quel.
System.out.println(Integer.parseUnsignedInt(Integer.toBinaryString(-15), 2)); // -15
Merci d'avoir souligné. (C'est une histoire de lecture du document officiel en premier lieu ...)
Recommended Posts