我能夠做到這一點,而不使用按位運算符如下轉換ASCII字符串爲整數使用C&位運算符反之亦然
int AsciiToInteger()
{
char s[] = "Stack Overflow";
int i, n = 0;
for (i = 0; s[i] !='\0'; i++)
{
n += s[i];
}
return n;
}
我怎麼能同通過在C位操作實現,而無需使用for循環?
我能夠做到這一點,而不使用按位運算符如下轉換ASCII字符串爲整數使用C&位運算符反之亦然
int AsciiToInteger()
{
char s[] = "Stack Overflow";
int i, n = 0;
for (i = 0; s[i] !='\0'; i++)
{
n += s[i];
}
return n;
}
我怎麼能同通過在C位操作實現,而無需使用for循環?
可以達到同樣沒有for
循環使用遞歸:
int AsciiToInteger(const char * Str)
{
if(*Str)
return (int)*Str + AsciiToInteger(Str+1);
else
return 0;
}
/* ... */
int n = AsciiToInteger("Stack Overflow");
我不知道是什麼位運算符有這個做,你一定不能只使用其中沒有一個循環,並沒有遞歸對於任意長度的字符串(對於固定長度的字符串,取而代之的結果可能是像展開循環一樣)。
...但現在,我看我敢肯定我沒有得到這個問題的意義評論... :S
現在我知道爲什麼'atoi'具有*未定義的行爲*,而不僅僅是溢出時未指定的值...> _ < –
除在建的位運算較高的操作練習,你試圖完成的任務是愚蠢的。不要這樣做。
作爲一個練習,要認識到的最重要的事情是,您不必每次需要根據構建塊實施新功能時就重新開始。相反,您可以使用按位構建塊編寫加法和減法函數,並使用現有的更高級別的算法將它們組合在一起。
至於消除循環,除非需要支持任意數量的前導零,否則您可以將其展開以支持固定的最大位數(例如,最長的值將適合int
)。一般而言,遞歸是一種非常糟糕的做法,與本次練習的整個「接近金屬」方面相反。也許他們只是希望你避免在「高級」加法循環中添加/遞增計數器,在這種情況下,你可以使用你的按位加法器函數...
循環存在的一個主要原因是您可以執行未知次數的操作。如果你不知道你的字符串有多長,你沒有辦法沒有循環。即使你知道字符串的長度,爲什麼你想不做循環呢?
這顯然不是標準的'atoi'函數,它可能是一個好主意,使用一個不同的名稱,並解釋你想達到什麼。我沒有看到你在代碼中的任何地方使用按位運算符 - 這可能是也可能不是你的觀點,我根本不理解這一部分,尤其是因爲我希望atoi在沒有它們的情況下工作,實現 - 以及爲什麼你期望能夠使用任意長度的字符串做任何事情而沒有循環? –
@克里斯托弗,你是對的。這與標準功能沒有任何關係。我只是想知道是否可以使用按位來完成,而不是使用for循環。 – Kelly
誰提出這個問題?目前它根本沒有任何意義。 –