[Java] Berücksichtigung beim Umgang mit negativen Binärzahlen mit Integer.parseInt ()

Betriebsumgebung

Java11

Inhalt

Es ist keine große Sache, also komme ich plötzlich zum Hauptthema.

In Java werden negative Zahlen intern durch das Komplement von 2 dargestellt. Sie können Integer.toBinaryString () verwenden, um eine Zeichenfolge mit einer internen Darstellung abzurufen.

Im Fall einer Binärzahl ist das Komplement von 2 die Zahl, die durch Invertieren aller Bits und anschließendes Addieren von 1 erhalten wird. Da die Dezimalzahl 15 in der Binärzahl 1111 ist, ist die Dezimalzahl -15 der folgende Wert.

System.out.println(Integer.toBinaryString(-15))  // 11111111111111111111111111110001

Die Übergabe dieses Werts an Integer.parseInt () führt jedoch zu einem Fehler.

Integer.parseInt(Integer.toBinaryString(-15), 2)
//Ausnahme Java.lang.NumberFormatException: For input string: "11111111111111111111111111110001"
//        at NumberFormatException.forInputString (NumberFormatException.java:65)
//        at Integer.parseInt (Integer.java:652)
//        at (#9:1)

Anscheinend müssen Sie Integer.parseInt () in Form einer positiven Binärzahl mit negativem Vorzeichen übergeben, anstatt den Wert der internen 2-Komplement-Darstellung.

System.out.println(Integer.parseInt("-1111", 2))  // -15

das ist alles.

Postskriptum 2019/3/4 Sie haben in den Kommentaren auf einige hingewiesen.

https://docs.oracle.com/javase/jp/8/docs/api/java/lang/Integer.html#toBinaryString-int-

Gibt die Zeichenfolgendarstellung des Integer-Arguments als vorzeichenlose Ganzzahl von Basis 2 zurück. Der vorzeichenlose int-Wert ist das Argument plus 2 ^ 32, wenn das Argument eine negative Zahl ist.

(Der Teil, der beim Kopieren zu 232 wird, wird auf 2 ^ 32 korrigiert.)

Es wurde festgestellt, dass, wenn das Argument ein negativer Wert ist, eine interne 2-Komplement-Darstellung zurückgegeben wird, das offizielle Dokument jedoch die obige Beschreibung zu haben scheint. Das Ergebnis ist jedoch das gleiche. Ich habe es mit Ruby überprüft. (Weil Java überläuft und problematisch ist)

Zunächst der Rückgabewert von Javas Integer.toBinaryString ()

System.out.println(Integer.toBinaryString(-15));  // 11111111111111111111111111110001

Binäre Darstellung des Wertes des Arguments (-15) plus 2 ^ 32

n = -15 + 2 ** 32
puts(n.to_s(2))   # 11111111111111111111111111110001

Es wurde bestätigt, dass beide 11111111111111111111111111110001 wurden.

Außerdem scheint es eine Methode namens Integer.parseUnsignedInt () zu geben, die diese interne Binärzahl so wie sie ist analysieren kann.

System.out.println(Integer.parseUnsignedInt(Integer.toBinaryString(-15), 2));  // -15

Vielen Dank für den Hinweis. (Es geht in erster Linie darum, das offizielle Dokument zu lesen ...)

Recommended Posts

[Java] Berücksichtigung beim Umgang mit negativen Binärzahlen mit Integer.parseInt ()
Fehler beim Spielen mit Java
Hinweise zur HTTP-Kommunikation mit Java (OkHttp)
Beim Aufrufen der API mit Java tritt eine javax.net.ssl.SSLHandshakeException auf
[Java] Vorsichtsmaßnahmen beim Vergleichen von Zeichenfolgen mit Zeichenfolgen
Geben Sie ClassPath an, wenn Sie jupyter + Java mit WSL verwenden
Behandlung des Zugriffs auf Refactor-Eigenschaften mit Java Method Util
[Java] Finden Sie die Primzahl mit dem Eratostenes-Sieb
Unterscheiden Sie in Java zwischen positiven und negativen Zahlen
Erstellen wir eine TODO-Anwendung mit Java 11-Ausnahmebehandlung, wenn Sie mit einer nicht vorhandenen ID auf TODO zugreifen