Преобразование 32-битных шестнадцатеричных чисел в десятичные в java

для задания мне нужно написать программу, которая будет принимать строку из 8 символов (шестнадцатеричная), а затем преобразовывать ее в базу 10. Мне не разрешено использовать для этого какие-либо внешние классы. Я почти уверен, что он работает правильно... только для положительных чисел. Моя проблема в том, как показать отрицательные числа. например, FFFFFFFA должен выводиться как -6. Это мой код до сих пор

package hexconverter;

import java.util.*;

/**
 *
 * @author Steven
 */
public class Main {

    Scanner scanner = new Scanner(System.in);

    public void doWork() {



        System.err.println("Please enter the internal representation: ");
        String hex;
        hex = scanner.next();
        hex = hex.toUpperCase();

        long count = 1;
        long ans = 0;

        for (int i = 7; i >= 0; i--) {
            Character c = hex.charAt(i);

            if (c != '1' && c != '2' && c != '3' && c != '4' && c != '5' && c != '6' && c != '7' && c != '8' && c != '9') {
                int num = fixLetters(c);
                ans = ans + (num * count);
                count = count * 16;
            } else {

                String s = c.toString(c);
                long num = Integer.parseInt(s);
                ans = ans + (num * count);
                count = count * 16;
            }
        }

       if (ans > 2147483647) {
            System.out.println("is negative");


       } else {
            System.out.println(ans);
       }
    }

    public int fixLetters(Character c) {
        if (c.equals('A')) {
            return 10;
        } else if (c.equals('B')) {
            return 11;
        } else if (c.equals('C')) {
            return 12;
        } else if (c.equals('D')) {
            return 13;
        } else if (c.equals('E')) {
            return 14;
        } else if (c.equals('F')) {
            return 15;
        } else {
            return 0;
        }

    }

    public static void main(String[] args) {
        // TODO code application logic here
        Main a = new Main();
        a.doWork();
    }
}

Я думаю, что мой тест для отрицательного целого числа верен... поскольку это максимальное значение, которое может удерживать 32 бита, все, что выше этого, будет переполнением, а это означает, что оно должно быть отрицательным. Отсюда я понятия не имею, как это сделать. Любые указатели или советы будут весьма признательны. Если нет способа сделать это математически, я чувствую, что мне придется преобразовать шестнадцатеричный код в двоичный, а затем выполнить над ним два дополнения, но опять же, я не знаю, с чего начать.

заранее спасибо


person Cheesegraterr    schedule 28.09.2011    source источник
comment
потому что половина для положительного, а половина для отрицательного, верно? Спасибо, я пропустил это!   -  person Cheesegraterr    schedule 28.09.2011
comment
@Hovercraft Full Of Eels: Последний раз, когда я проверял, 2^31 = 2147483648   -  person Mysticial    schedule 28.09.2011
comment
черт, ты прав. :( Я скоро удалю свои комментарии. Извините!   -  person Hovercraft Full Of Eels    schedule 28.09.2011


Ответы (2)


В 32-битном двоичном представлении с дополнением до 2 значение отрицательного числа ровно на 2 ^ 32 меньше, чем значение того же битового шаблона в беззнаковом представлении. Вы уже определили, что число может быть отрицательным; все, что осталось сделать, это вычесть 2 ^ 32.

Конечно, 2 ^ 32 (4294967296 в десятичном виде или 0x100000000 в шестнадцатеричном) — это значение, которое не может быть представлено типом «int» Java, поэтому вам нужно будет использовать «длинный»:

if (ans > 2147483647) {
    // System.out.println("is negative");
    ans = ans - 0x100000000L;
    System.out.println(ans);
} else {
person davmac    schedule 28.09.2011

Если число отрицательное (> 2147483647) в вашем коде, просто вычтите из него 2^32 (4294967296). Затем распечатайте его.

if (ans > 2147483647) {
        System.out.println(ans - 4294967296L);
   } else {
        System.out.println(ans);
   }
person Mysticial    schedule 28.09.2011
comment
Благодарю вас! Я не могу поверить, что я не видел, что сам, кажется, работает отлично. - person Cheesegraterr; 28.09.2011