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

Мне был поручен проект по преобразованию значений 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
Задание, вы можете попробовать сами.. кстати, желательно, чтобы имя класса Java было BinToDec, а не binToDec
 – 
spiderman
10 Июл 2014 в 02:51

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 10 Июл 2014 в 02:54
Ваш ответ лучше моего, но одно изменение: оно должно быть «в вашей строке binary больше 32 бит».
 – 
Jashaszun
10 Июл 2014 в 02:56
В Java int подписаны, поэтому использование этого старшего 32-го бита вызовет переполнение (если он установлен). На самом деле, использование long просто откладывает проблему, так как это все еще будет иметь проблему переполнения, если в строке binary представлено более 63 бит.
 – 
rgettman
10 Июл 2014 в 02:58
Большое спасибо за ответ и объяснение! Получил, чтобы он работал идеально!
 – 
MrSpyGuy
10 Июл 2014 в 02:58
Ах да, конечно! Я не могу поверить, что не получил это сам.
 – 
Jashaszun
10 Июл 2014 в 21:36

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

0
Jashaszun 10 Июл 2014 в 02:52
Какие типы я могу использовать?
 – 
MrSpyGuy
10 Июл 2014 в 02:55
Длинный, потому что он 64-битный.
 – 
Jashaszun
10 Июл 2014 в 02:55