使用C&中的按位运算符将ASCII字符串转换为整数反之亦然

时间:2011-08-23 14:46:06

标签: c string bit-manipulation

我能够在不使用按位运算符的情况下执行此操作,如下所示

int AsciiToInteger()
{
  char s[] = "Stack Overflow";
  int i, n = 0;
  for (i = 0; s[i] !='\0'; i++)
  {
    n += s[i]; 
  }

  return n;
}

如何在不使用for循环的情况下使用C中的按位运算符实现相同的效果?

3 个答案:

答案 0 :(得分:1)

使用递归可以在没有for循环的情况下实现相同的目的:

int AsciiToInteger(const char * Str)
{
    if(*Str)
        return (int)*Str + AsciiToInteger(Str+1);
    else
        return 0;
}

/* ... */
int n = AsciiToInteger("Stack Overflow");

我不知道bitwise运算符与此有什么关系,你肯定不能只使用它们没有循环而没有递归对于任意长度的字符串(对于固定长度字符串而不是结果会可能就像展开循环一样。)

......但是现在我读了评论,我很确定我没有理解这个问题...... :S

答案 1 :(得分:0)

除了通过按位操作构建更高级别操作的练习外,您尝试完成的任务是愚蠢的。不要这样做。

作为一项练习,最重要的事情是,每次你需要在构建块方面实现新的东西时,你不必回到起点。相反,您可以根据按位构建块编写加法和减法函数,并使用现有的高级算法将它们组合在一起。

至于消除循环,您可以将其展开以支持固定的最大位数(例如,适合int的最长值),除非您需要支持任意数量的前导零。递归是一种非常糟糕的方法,与本练习的整个“接近金属”方面相反。也许他们只是希望你避免在循环中添加/递增计数器并添加“高级”,在这种情况下你可以使用你的按位加法器函数......

答案 2 :(得分:0)

存在循环的主要原因之一是您可以执行未知次数的操作。如果您不知道字符串有多长,那么没有循环就无法做到这一点。即使你知道字符串的长度,你为什么要在没有循环的情况下进行呢?

相关问题