0

所以我设计了一个算法来接收一个 32 位的 char 数组,并将其转换为适当的十进制等价物。

double calculateDecimal(char *string){
    char *temp=string;
    double total=0;
    int i;
    int count=31;
    int x=pow(2,count);
    for(i=0;i<32;i++){
        if(!strncmp(temp,"1",1){
            printf("%d + %d\n",x,total);
            total+=x;
        }
        temp++;
        count--;
        x=pow(2,count);
    }
    printf("%d\n",total);
    return total;

}

1)我的 printf 语句已经证明正在读取正确的 1 并且正在计算它们的正确功率。我发现的是总和 x 一直等于我感到困惑的相同功率,因为​​我正处于风口浪尖上。

2)我的示例计算是 00000000100000010000000000000111,如果我输入正确应该是 84554151 的十进制等值。感谢您的任何贡献,因为我知道我很接近。

4

2 回答 2

2

如果是 32 位输入,为什么不使用 32 位整数来包含结果呢?该pow函数是一个浮点运算,这使得任务更难。请考虑位操作。

int toInt(char *str)
{
  int val = 0;
  while (*str) 
    val = (val << 1) | (*str++ == '1');
  return val;
}

另请注意,每次找到新字符时,通过将先前的结果左移(乘以 2),这将适用于最长 32 位长的任何字符串

于 2013-09-21T00:16:53.357 回答
1

好吧,您的代码实际上在这里有语法错误(缺少右括号):

if(!strncmp(temp,"1",1){

关于二进制->十进制转换的问题,我会推荐霍纳评估多项式的​​方法:http ://en.wikipedia.org/wiki/Horner%27s_method

将二进制展开式视为一个多项式,其中每个系数为 0 或 1。计算 x = 2 的多项式会得到实际值,您可以将其打印为十进制:

long calculateValue(char * string) {
    long result = 0;
    while(*string){
        result = ((*string) - '0') + result * 2;
        string++;
    }
    return result;
}

(并且请不要将 pow() 和其他浮点函数用于整数运算 - 特别是用于计算 2 的幂)

顺便说一句,您可以使用这种方法来评估以任何基数编写的数字:

long calculateValue(char * string, int base) {
    long result = 0;
    while(*string){
        result = ((*string) - '0') + result * base;
        string++;
    }
    return result;
}

当然,这适用于基数 1-10,因为在 ASCII 表中,'9' 后跟 ':',但你明白了。

于 2013-09-21T00:19:52.007 回答