我能够在不使用按位运算符的情况下执行此操作,如下所示
int AsciiToInteger()
{
char s[] = "Stack Overflow";
int i, n = 0;
for (i = 0; s[i] !='\0'; i++)
{
n += s[i];
}
return n;
}
如何在不使用for循环的情况下使用C中的按位运算符实现相同的效果?
答案 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)
存在循环的主要原因之一是您可以执行未知次数的操作。如果您不知道字符串有多长,那么没有循环就无法做到这一点。即使你知道字符串的长度,你为什么要在没有循环的情况下进行呢?