Здесь нужна помощь:

Мне был поручен проект по преобразованию значений Hex в файле в Decimal с использованием Java без использования методов, доступных в Java, которые могут делать это напрямую (мы должны сделать это долгим путем).

Я успешно преобразовал свои шестнадцатеричные значения в двоичные, но у меня возникли проблемы с преобразованием двоичных строк в десятичные. Вывод неверен; Мне нужна помощь только в этом разделе, поэтому я просто помещаю первое двоичное значение, которое мне нужно преобразовать, чтобы упростить понимание и объяснение. Вот что у меня есть

public class binToDec {

    public static void main(String[] args) {
        int decimal = 0;
        String binary = "101010111100110111101111101010111100";
        for (int pow = (binary.length()-1); pow > -1; pow--) {
            if (binary.charAt(pow)=='1'){
            decimal += (Math.pow(2, pow));
            }
        }
        System.out.print(decimal);
    }
}

run: 2147483647 // это неверно. это должно быть 46118402748

Спасибо большое за твою помощь

0
MrSpyGuy 10 Июл 2014 в 02:47

2 ответа

Лучший ответ

В вашем коде есть 2 проблемы.

  1. Переполнение, безусловно, происходит, потому что int может содержать только значение до 2 ^ 31 - 1, а в вашей строке binary более 31 бита. Объявите decimal long.

    long decimal = 0;
    
  2. Вы применяете показатель степени с неправильного конца цикла при добавлении к decimal. Символ 0 является наиболее значимым, но вы отправляете показатель степени 0, как если бы он был наименее значимым. Пытаться

    decimal += (Math.pow(2, (len - pow - 1)));
    

    (Предполагается, что len объявлен как int len = binary.length();.)

    Использование Math.pow может считаться излишним. Вы также можете попробовать

    decimal += 1L << (len - pow - 1);
    
2
rgettman 9 Июл 2014 в 22:54

Это не сработает, потому что int в Java 32-битный, а ваша двоичная строка там имеет 36 бит. Это приведет к переполнению.

0
Jashaszun 9 Июл 2014 в 22:52