C中的十进制到二进制
我正在创建一个添加和减去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 = 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类型的参数,这对我来说有点不清楚。
编辑:我的答案是int
类型,而不是long double
。
如果你真的想在没有修改的情况下重用你的函数,你可以将answer
转换为十进制字符串并将字符串传递给你的函数。
char stringAnswer[20]; sprintf(stringAnswer, "%d", answer); printf("the binary answer is %s\n", decimalBinary(stringAnswer));
但更好的解决方案应该是将函数decimalBinary
分成两个函数:第一个用于检查所有数字是否正常,第二个用于将int
转换为二进制字符串。 然后你将能够直接调用第二个函数,并将answer
作为参数。
而不是使用幻数32,最好让编译器推导出所需的大小,因为int
并不总是32位。 检查分配结果是一个好习惯。
#include #include #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)
提供所需的缓冲区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 #include 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; }