Почему мой двоичный код для десятичной программы дает неверные результаты?

Я работаю над этой программой, которая берет двоичную строку и преобразует ее в десятичную, используя это руководство для преобразования из двоичного в десятичное. Когда я запускаю цикл for в моей голове, я получаю правильные результаты. И все же, когда я запускаю свою программу, я получаю этот странный вывод:

1
3
7
15
31
63
127

Фактический вывод должен выглядеть следующим образом:

1
2
5
11
22
44
89

Я не могу понять это для жизни меня. Почему моя программа делает это? Здесь текущий исходный код:

public class BinaryToDecimal
{
public static void main(String[] args)
{
    String binary = "1011001";
    int toMultiplyBy;
    int decimalValue = 0;
    for (int i = 1; i <= binary.length(); i++)
    {
        int whatNumber = binary.indexOf(i);
        if (whatNumber == 0)
        {
            toMultiplyBy = 0;
        }
        else
        {
            toMultiplyBy = 1;
        }
        decimalValue = ((decimalValue * 2) + toMultiplyBy);
        System.out.println(decimalValue);
        }
    }
}

Ответ 1

Строки основаны на 0, поэтому вы должны проходить через String от 0 до < длина строки, но indexOf(...) - это не то, что вы хотите использовать, так как это будет искать местоположение в строках небольших ints, что не имеет смысла. Вам все равно, где char эквивалент 2 находится в String или даже если он вообще находится в String.

Вместо этого вы хотите использовать charAt(...) или subString(...), а затем разобрать на int. Я бы использовал

for (int i = 0; i < binary.length(); i++) {
    int whatNumber = charAt(i) - '0'; // converts a numeric char into it int
    //...

Чтобы узнать, что это делает, создайте и запустите:

public class CheckChars {
   public static void main(String[] args) {
      String foo = "0123456789";

      for (int i = 0; i < foo.length(); i++) {
         char myChar = foo.charAt(i);
         int actualIntHeld = (int) myChar;
         int numberIWant = actualIntHeld - '0';

         System.out.printf("'%s' - '0' is the same as %d - %d = %d%n", 
               myChar, actualIntHeld, (int)'0', numberIWant);
      }
   }
}

Что возвращает:

'0' - '0' is the same as 48 - 48 = 0
'1' - '0' is the same as 49 - 48 = 1
'2' - '0' is the same as 50 - 48 = 2
'3' - '0' is the same as 51 - 48 = 3
'4' - '0' is the same as 52 - 48 = 4
'5' - '0' is the same as 53 - 48 = 5
'6' - '0' is the same as 54 - 48 = 6
'7' - '0' is the same as 55 - 48 = 7
'8' - '0' is the same as 56 - 48 = 8
'9' - '0' is the same as 57 - 48 = 9

Цифры, представляющие символы, основаны на старой таблице ASCII, которая дает каждому символу числовое представление. Подробнее об этом см. Здесь Таблица ASCII

Ответ 2

Две точки:

  • Индексирование массива начинается с нуля, а не 1, поэтому ваш цикл должен быть `for (int я = 0; i
  • Вы путаете indexOf() с substring(). В вашем случае binary.indexOf(i) выполняет следующее. Во-первых, целое число i преобразуется в строку. Затем binary выполняется поиск влево-вправо для подстроки, соответствующей строковому значению i. Первый раз через цикл i==1. Это возвращает ноль, потому что там 1 с нулевым индексом в binary. Во второй раз значение i равно 2. Там нет 2 в binary, так что это возвращает ноль. Для i==3 вы ищете строку 3 в binary, которая никогда не будет правдой.

Взгляните на метод String#substring(), который, как я полагаю, вам нужен.