Java11
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