Преобразование из двоичной строки в десятичную? - PullRequest
0 голосов
/ 17 августа 2011

В следующем коде я преобразовываю двоичный код в десятичный, а затем печатаю соответствующий ему символ.

void convertToChar(int binaryChar[],int length)
{
int multiplier = 0;
int i;
int sum = 0;
for(i=length;i>=0;i++)
{
    sum = sum + (binaryChar[i]*pow(2,multiplier));
    multiplier = multiplier + 1;
}
printf("\nThe character is: %c",sum);
}

Проблема в строке sum = sum + (binaryChar[i]*pow(2,multiplier));. Выдает ошибку: warning: converting to int 'из double' .Помогите помочь!

Ответы [ 4 ]

3 голосов
/ 17 августа 2011

Почему вы используете pow для вычисления степени 2? Это слишком медленно. Используйте 1 << p, чтобы получить p-ую степень двойки. Например, 1 << 0 даст 1, 1 << 1 даст 2, 1 << 2 даст 4. Это связано с характером операции битового сдвига: сдвиг одного бита влево эквивалентен умножению на 2.

Кроме того, похоже, что в вашей программе есть бесконечный цикл:

for(i=length;i>=0;i++)

Если length равен> = 0, цикл никогда не прекратится.

Это должно это исправить:

for(i = length - 1; i>=0; i--) sum += (binaryChar[i]*(1 << multiplier++));
1 голос
/ 17 августа 2011

подпись pow:

double pow(double X, double Y);

для расчета 2 ^ использование множителя:

1 << multiplier;

Просто чтобы быстро упомянуть:

  • У вас есть бесконечный цикл
  • Если вы анализируете строку в другом направлении, вы можете умножить сумму на два, чтобы вам не понадобилась переменная multiplier.
  • После многих проблем я даже не уверен, что int binaryChar[] прав. Символ в имени предлагает другой тип (и код) ..

.

0 голосов
/ 17 августа 2011

Проблема в том, что точность типа данных int меньше, чем точность double (функция pow возвращает double), поэтому значение binaryChar [i] будет имплицитно преобразовано в double и т. Д.на ... проблемная строка неявно выглядит следующим образом:

sum = (double) sum + ((double) binaryChar[i] * pow((double)2, (double) multiplier))

, чтобы избавиться от предупреждения, вам необходимо выполнить явное преобразование (см. Преобразование типов ), например:

sum = sum + (binaryChar[i] * ((int) pow(2, multiplier));
0 голосов
/ 17 августа 2011

пау получает двойные и возвращает двойные. Уродливое решение - просто использовать приведение

(int)pow(x, y)

Но в этой простой программе, почему бы не сделать расширение мощности самостоятельно, вместо вызова pow?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...