2016-06-20 12 views
2

Ich frage mich, ob es möglich ist, eine vorzeichenbehaftete Hexadezimalzahl (negativ) in den entsprechenden Dezimalwert zu konvertieren.Signiertes Hexadezimal zu Dezimal in Java

+0

Angenommen, Ihre Eingabe ist eine Zeichenfolge, die in '-' beginnt und nur Hexadezimalziffern enthält. 'Integer.parseInt (input, 16)' funktioniert. – Eran

+0

zeigen Sie uns, was Sie bisher haben –

+0

Was ich gerade mache ist, dass ich das negative hex nehme und es in binäre umwandeln. Ich habe ein Zweierkomplement binär bis dezimal. Es funktioniert mit kleinen Werten. Aber wenn ich versuche, große Werte wie -4000 (unter Annahme von hex) zu konvertieren, ist es nicht korrekt. – Jujumancer

Antwort

3

Ich nehme an, dass Sie einen Hexadezimalwert in einem String haben.

Die Methode parseInt(String s, int radix) kann einen hexadezimalen (vorzeichenbehafteten) String und mit der richtigen Radix (16) wird es zu einem Integer parsen.

int decimalInt = parseInt(hexaStr, 16); 

die Lösung oben funktioniert nur, wenn Sie Zahlen wie -FFAA07BB haben ... wenn Sie die Twos wollen ergänzt werden Sie es selbst konvertieren.

String hex = "F0BDC0"; 

// First convert the Hex-number into a binary number: 
String bin = Integer.toString(Integer.parseInt(hex, 16), 2); 

// Now create the complement (make 1's to 0's and vice versa) 
String binCompl = bin.replace('0', 'X').replace('1', '0').replace('X', '1'); 

// Now parse it back to an integer, add 1 and make it negative: 
int result = (Integer.parseInt(binCompl, 2) + 1) * -1; 

oder wenn Sie das Gefühl, mit einem Einzeiler:

int result = (Integer.parseInt(Integer.toString(Integer.parseInt("F0BDC0", 16), 2).replace('0', 'X').replace('1', '0').replace('X', '1'), 2) + 1) * -1; 

Wenn die Zahlen so groß werden (oder klein), dass ein Integer einen Überlauf haben, verwenden Sie Long.toString(...) und Long.parseLong(...) stattdessen.

+0

Ich habe es versucht und leider eine vorzeichenlose Ganzzahl (15777216) zurückgegeben. Mein Hex-Wert ist "F0BDC0", der -1000000 sein sollte. – Jujumancer

+1

@Jujumancer Ich habe meinen Post bearbeitet ... diese selbstgemachte Lösung sollte für Sie arbeiten ... Aber seien Sie vorsichtig, diese Lösung behandelt jede Zahl als negative Zahl, auch wenn sie positiv wäre! Sie müssen feststellen, ob die Zahl selbst negativ ist und entweder die obere oder untere Lösung verwenden. – ParkerHalo

+0

Vielen Dank. Ich werde es auch mit anderen Werten überprüfen. Ich werde Ihre Methode nur für vorzeichenbehaftete Hexadezimalwerte verwenden. Prost – Jujumancer