我需要创建将二进制数(字符串)转换为十进制数(long)的简单函数。当它返回结果时,它是无意义的。我试图返回所有其他变量并返回正确的数字。我的结果变量有问题。
#include "stdio.h"
#include "string.h"
#include "math.h"
long bintodec(const char *bin_num) {
long DIGIT, SUBTOTAL, RESULT = 0, I, LEN;
LEN = strlen(bin_num);
for(I = 0; I != LEN; I++) {
sscanf(&bin_num[I], "%li", &DIGIT);
SUBTOTAL = DIGIT * pow(2, LEN - I - 1);
RESULT = RESULT + SUBTOTAL;
}
return RESULT;
}
main() {
clrscr();
printf("%li", bintodec("101"));
getch();
}
答案 0 :(得分:1)
sscanf
期待一个C字符串:
"101"
,101 * 4
为404
01
,1 * 2
为2
1
,1 * 1
为1
404 + 2 + 1
是407
,这一定是你看到的废话你想要的是转换每个角色:
DIGIT = bin_num[I] - '0';
答案 1 :(得分:0)
您可以一次性将字符串转换为long,无需循环迭代。如下所示更改代码可以为您提供所需的输出
#include <stdio.h>
#include <string.h>
#include <math.h>
long bintodec(const char *bin_num)
{
long DIGIT, SUBTOTAL, RESULT = 0, I, LEN, REM;
LEN = strlen(bin_num);
sscanf(bin_num, "%li", &DIGIT);
printf("DIGIT = %li\n", DIGIT);
for (I = 0; I < LEN; I++)
{
REM = DIGIT%10;
RESULT += REM * pow(2, I);
DIGIT /= 10;
}
return RESULT;
}
int main() {
printf("%li", bintodec("101"));
}
答案 2 :(得分:0)
我会提供更优雅的解决方案,而不是调试您的代码。考虑:
long bintodec(const char *bin_num)
{
long sum = 0;
for (; *bin_num != '\0'; bin_num++) /* move pointer through string */
{
sum <<= 1; /* shift bits left (meaningless on first pass) */
sum |= (*bin_num == '1'); /* conditionally tack on new least significant bit */
}
return sum;
}
一些注意事项:
关键是编码整数类型变量的位与作为字符串传入的二进制序列相同。因此:按位运算符。我们这里唯一需要的是左移位,它将每个底层位移到左边一位,然后按位 - 或者逻辑上或者将两个数字的位相互移位。等效表示使得对问题的图形理解有效。
我们可以将输入的位插入右侧,而不是必须通过整个字符串来确定其长度,并使用它来通知pow函数。
这里是for循环中的内容:
第一遍:sum <<= : 00000 /* more zero's contained in a long */
string: "10101"
ptr: ^
sum |= : 00001
第二遍:
sum: 00010
string: "10101"
ptr: ^
sum: 00010
第三遍:
sum: 00100
string: "10101"
ptr: ^
sum: 00101
......等等。
一般而言,而不是调用
pow(2, arg)
你应该利用位移运算符,它完全实现乘以2的幂。 (在基数10中附加零乘以10)。