2015-07-05 3 views
2

Я создаю программу, которая добавляет и вычитает 2 числа. Затем я должен вывести этот ответ на разные базы.Decimal to Binary in C

Мой ответ в десятичном формате, типа длинного двойного, таких как:

long double answer; 
answer = numberOne + numberTwo; 

Я хочу, чтобы преобразовать этот ответ в бинарный код. Теперь у меня есть код, используемый ранее в моей программе, которая делает это, но с указателем полукокса:

char * decimalBinary (char * decimalNumber) 
{ 

    bool zeroFront = true; 
    int i; 
    int z; 
    int j = 0; 
    int n = atoi(decimalNumber); 
    char * binaryNum = malloc(32+1); 
    binaryNum[32] = '\0'; 

    int current_index=1; 
    int end_index = strlen(decimalNumber)-1; 

    //Error check for valid decimal input, needed error check for beginning of code 
    while(current_index <= end_index) 
    { 
     if(decimalNumber[current_index] != '0' &&decimalNumber[current_index] != '1' &&decimalNumber[current_index] != '2' &&decimalNumber[current_index] != '3' &&decimalNumber[current_index] != '4' &&decimalNumber[current_index] != '5' &&dec[current_index] != '6' &&dec[current_index] != '7' &&decimalNumber[current_index] != '8' &&decimalNumber[current_index] != '9') 
     { 
      binaryNum[0] = -8; 
      return binaryNum; 
     } 
     current_index++; 
    } 


    for (i = 31; i >= 0; i--) { 
     z = n >> i; 

     if (z & 1) 
     { 
      binaryNum[j] = '1'; 
      j++; 
      zeroFront = false; 
     } 
     else if (!zeroFront) 
     { 
      binaryNum[j] = '0'; 
      j++; 
     } 
    } 

    binaryNum[j] = '\0'; 

    return binaryNum; 
} 

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

Еще одно возможное решение, которое отвлекает от использования кода повторного использования в моей программе, заключается в создании другой функции, которая преобразует десятичную дробь в двоичный код, но принимает параметр типа long double, который немного неясен для меня как Что ж.

Редактировать: Вместо long double, мой ответ относится к модели int.

+1

Преобразование двоичного 'long double' в двоичном формате сильно отличается от преобразования' int' в двоичный код (это то, что делает ваш код). Вы уверены, что это то, что вы хотите? Какой результат вы ожидаете, преобразовывая 1,5 в двоичный формат? –

+0

Да, я считаю, что я должен изменить long double на int – Bret

+1

. Ваш 'answer' находится в любом формате, который система использует для представления своего типа. Является ли этот тип 'int' или' long double', его формат вряд ли будет хорошо охарактеризован как «десятичный». –

ответ

0

Если вы действительно хотите повторно использовать свою функцию без изменений, вы можете преобразовать answer в десятичную строку и передать строку вашей функции.

char stringAnswer[20]; 
sprintf(stringAnswer, "%d", answer); 
printf("the binary answer is %s\n", decimalBinary(stringAnswer)); 

Но лучшее решение должно быть разделение функции decimalBinary на две функции: первая, чтобы проверить, что все цифры в порядке, а второй один для преобразования int в двоичную строку. Затем вы можете вызвать эту вторую функцию непосредственно с параметром answer.

0

Вместо того, чтобы использовать магическое число 32, лучше дать компилятору вывести необходимый размер как int не всегда 32 бита. Проверка результатов распределения является хорошей привычкой.

#include <assert.h> 
#include <stdlib.h> 

#define INT_MAX_BIN_WIDTH (sizeof(int) * CHAR_BIT) 
char * binaryNum = malloc(INT_MAX_BIN_WIDTH+1); 
assert(binaryNum != NULL); 
binaryNum[INT_MAX_BIN_WIDTH] = '\0'; // null character 

Вместо проверки на каждой цифре, так как '0' к '9' должен быть последовательным:

// if(decimalNumber[current_index] != '0' &&decimalNumber[current_index] != '1' ... 
if (decimalNumber[current_index] < '0' || decimalNumber[current_index] >= '9') ... 
// or 
if (!isdigit((unsigned char) decimalNumber[current_index])) ... 

Проблема не затрагивает отрицательные числа. Лучше сказать, что они не произойдут или лучше, сделайте код обработанным.


Код выделяет память, но не освобождает ее. Подумайте о том, чтобы присвоить/высвободить код более высокого уровня и предоставить необходимый буфер до decimalBinary(char *dest, size_t size, const char *src). Надежный код также предоставит размер.

char *binaryNum = malloc(INT_MAX_BIN_WIDTH+1); 
assert(binaryNum != NULL); 
decimalBinary(binaryNum, INT_MAX_BIN_WIDTH+1, "123"); 
do_something(binaryNum); 
free(binaryNum); 

Ниже приводится решение, которое не ограничивается до 32 бит. Он не справляется с отрицательными числами и распределением памяти - безусловно, он должен предоставить некоторые идеи для вашего окончательного решения.

#include <stdio.h> 
#include <string.h> 

static void times10(char *binaryNumber, int carry) { 
    size_t length = strlen(binaryNumber); 
    size_t i = length; 
    while (i > 0) { 
    i--; 
    int sum = (binaryNumber[i] - '0') * 10 + carry; 
    binaryNumber[i] = sum % 2 + '0'; 
    carry = sum/2; 
    } 
    while (carry) { 
    memmove(&binaryNumber[1], &binaryNumber[0], ++length); 
    binaryNumber[0] = carry % 2 + '0'; 
    carry /= 2; 
    } 
} 

char *decimalBinary(char *binaryNumber, const char *decimalNumber) { 
    strcpy(binaryNumber, "0"); 
    int ch; 
    while ((ch = *decimalNumber++) >= '0' && (ch <= '9')) { 
    times10(binaryNumber, ch - '0'); 
    } 
    return binaryNumber; 
} 

int main(void) { 
    char buf10[200]; 
    puts(decimalBinary(buf10, "123")); 
    puts(decimalBinary(buf10, "123456")); 
    puts(decimalBinary(buf10, "123456789")); 
    return 0; 
}