Преобразование 32-битных шестнадцатеричных в десятичный в Java - PullRequest
0 голосов
/ 28 сентября 2011

для назначения я должен написать программу, которая будет принимать 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 бита, все, что превышает переполнение, будет означать, что оно должно быть отрицательным. Отсюда я понятия не имею, как это сделать. Любые указатели или советы будут с благодарностью. Если нет способа сделать это математически, я чувствую, что мне придется преобразовать гекс в двоичный файл, а затем выполнить с ним два дополнения, но, опять же, я не знаю, с чего начать.

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

Ответы [ 2 ]

3 голосов
/ 28 сентября 2011

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

if (ans > 2147483647) {
        System.out.println(ans - 4294967296L);
   } else {
        System.out.println(ans);
   }
2 голосов
/ 28 сентября 2011

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

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

if (ans > 2147483647) {
    // System.out.println("is negative");
    ans = ans - 0x100000000L;
    System.out.println(ans);
} else {
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...