C中的十进制到二进制

时间:2015-07-05 15:26:50

标签: c pointers binary type-conversion decimal

我正在创建一个添加和减去2个数字的程序。然后我必须将这个答案输出到不同的基础。

我的答案是十进制格式,类型为long double,例如:

long double answer;
answer = numberOne + numberTwo;

我想将此答案转换为二进制。现在我在我的程序中使用的代码执行此操作,但使用了char指针:

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

2 个答案:

答案 0 :(得分:0)

如果你真的想在没有修改的情况下重用你的函数,你可以将answer转换为十进制字符串并将字符串传递给你的函数。

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

但更好的解决方案应该是将函数decimalBinary拆分为两个函数:第一个用于检查所有数字是否正常,第二个用于将int转换为二进制字符串。 然后,您将能够以answer作为参数直接调用此第二个函数。

答案 1 :(得分: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, "123456789012345678901234567890"));
  return 0;
}