【问题标题】:Binary Algorithm C Programming二进制算法 C 编程
【发布时间】:2013-09-26 11:28:12
【问题描述】:

所以我设计了一个算法来接收一个 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 的十进制等效值。感谢您的任何贡献,因为我知道我很接近。

【问题讨论】:

  • 什么是“32 位字符数组”?
  • 问题肯定是x = pow(2, count);,因为xint,而pow() 返回doublepow(2, count) 的整数等效值为 1 &lt;&lt; count
  • 在此基础上进行扩展,您可能只想使用x = 1 &lt;&lt; count 而不是x = pow(2,count)
  • 我定义了一个名为 char finalBinary[33] 的数组来为空终止符腾出空间。当我将 x 更改为 pow 时,它打开了一个全新的单词罐,没有计算正确的 pow。
  • 您应该将x 声明为unsigned。否则,当您尝试将其设置为pow(2, 31) 时,它将溢出。

标签: c arrays binary char


【解决方案1】:

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

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

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

【讨论】:

  • 我认为,如果您将计算和增量拆分为单独的语句,而不是尝试像 C 允许的那样简洁。
  • @Barmar 我不这么认为。再次检查。
  • @Barmar 他做得很好。查找 K&R 中的成语对他来说很简单。
【解决方案2】:

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

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 的幂)

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-23
    • 2017-06-05
    • 2022-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-06
    • 2017-10-20
    相关资源
    最近更新 更多