これは何をしますか
while(*string) {
i = (i << 3) + (i<<1) + (*string -'0');
string++;
}
*文字列-'0'
文字値か何かを削除しますか?
これは、文字string
の ASCII コードを指している文字から減算し'0'
ます。だから、'0'
-'0'
を与えて0
、そして'9'
-'0'
を与えます9
。
string
ループ全体は基本的に、文字列が指す10進整数の数値を「手動で」計算しています。
これi << 3
は、 is equal to i * 8
and i << 1
is equal to i * 2
and (i << 3) + (i<<1)
is equal to i * 8 + i * 2
orのためi * 10
です。
数字 0 ~ 9 は文字セットに連続して格納されることが保証されているため、減算すると、'0'
文字数字の整数値が得られます。
ASCII を使用しているとしましょう:
char digit = '6'; //value of 54 in ASCII
int actual = digit - '0'; //'0' is 48 in ASCII, therefore `actual` is 6.
数字が文字セットにどのような値を持っていても、数字は連続している'0'
ため、数字から先頭 ( ) を引くと、探している数字が得られます。文字については特にそうではないことに注意してください。たとえば、EBCDIC を見てください。
0 ~ 9 文字の ASCII 値を数値に変換します。
'0' (文字) の ASCII 値は 48 で、'1' は 49 です。したがって、48-56('0'-'9') を 0-9 に変換するには、ASCII 値から 48 を引くだけです。それがあなたのコード行 [ *string -'0' ] が行っていることです。