Странное заполнение char массива. Например: 4' ' вместо '4'

Рейтинг: 1Ответов: 1Опубликовано: 14.11.2014
static string to_2(int n)
{
    char[] num_in_2 = new char[10000000];
    int i = 0;

    while (n > 0)
    {
        num_in_2[i] = (char)(n % 2);
        n /= 2;
        i++;
    }

    for(int j=0; j<(int)i/2; j++) //swap
    {
        char t = num_in_2[i];
        num_in_2[i] = num_in_2[i - 1 - j];
        num_in_2[i - 1 - j] = t;
    }

    return new string(num_in_2);
}

Сверху приведена функция перевода числа из десятичной в двоичную СС. Выводить значение функции программа в мейне не хочет. Открыв дебагер, я заметил, что char значение заполняются странно: 1' ' (вместо '1') и 0'\0' вместо '0', а дойдя до передачи значения в вывод, сама IDE (VS 2013) закрывается. Вот такая каша. В чём может крыться проблема?

Ответы

▲ 4Принят

Проблема в том, что этот алгоритм - адская задница как с точки зрения правильности, так и с точки зрения самого кода.

Во-первых, непонятно, зачем нужно резервировать массив символов аж из 10 миллионов (!) элементов.

Во-вторых, непонятно, зачем в цикле for нужно кастовать счетчик к int - он и так объявлен как int

В-третьих, сомнительна необходимость в двух циклах

В-четвёртых, кастуя 1 к char вы не получите символ '1'. То же самое касается и нуля. Следовательно, на выходе вы получите некорректную строку, отчего ваша программа и не работает

Вот более простой вариант:

static string ToBinary(int n)
{
    var res = new StringBuilder();
    do
    {
        res = res.Insert(0, n % 2 == 1 ? "1" : "0");
    } while ((n /= 2) > 0);
    return res.ToString();
}

Не претендую на высокую производительность (она тут, наверняка, не на высоте), однако он работает более корректно и выглядит куда компактнее