ce que cela faitqu'est-ce string - '0' faire (string est un char)
while(*string) {
i = (i << 3) + (i<<1) + (*string -'0');
string++;
}
la chaîne * -'0'
t-il supprimer la valeur de caractère ou quelque chose?
ce que cela faitqu'est-ce string - '0' faire (string est un char)
while(*string) {
i = (i << 3) + (i<<1) + (*string -'0');
string++;
}
la chaîne * -'0'
t-il supprimer la valeur de caractère ou quelque chose?
Ceci soustrait du caractère auquel string
pointe le code ASCII du caractère '0'
. Ainsi, '0'
- '0'
vous donne 0
et ainsi de suite et '9'
- '0'
vous donne 9
.
La boucle entière calcule fondamentalement "manuellement" la valeur numérique de l'entier décimal dans la chaîne string
points à.
C'est parce que i << 3
est équivalent à i * 8
et i << 1
est équivalent à i * 2
et (i << 3) + (i<<1)
est équivalent à i * 8 + i * 2
ou i * 10
.
Il convertit la valeur ASCII de 0-9 caractères à sa valeur numérique.
La valeur ASCII de '0' (caractère) est 48 et '1' est de 49. Donc, pour convertir 48-56 ('0' - '9') en 0-9, il vous suffit de soustraire 48 de la valeur ASCII. C'est ce que fait votre ligne de code [* string -'0 '].
Comme les chiffres 0-9 sont garantis être stockés de manière contiguë dans le jeu de caractères, la soustraction '0'
donne la valeur entière du chiffre que vous avez.
Disons que vous utilisez ASCII:
char digit = '6'; //value of 54 in ASCII
int actual = digit - '0'; //'0' is 48 in ASCII, therefore `actual` is 6.
Peu importe quelles valeurs les chiffres ont dans le jeu de caractères, car ils sont contigus, en soustrayant le début ('0'
) à partir du chiffre donnera le chiffre vous cherchez. Notez que la même chose n'est pas particulièrement vrai pour les lettres. Regardez EBCDIC, par exemple.
Très utile. Cela m'a aidé mieux que la réponse acceptée. Merci! –
Les compilateurs peuvent optimiser ... pourquoi les gens pensent qu'ils ont besoin de faire '(i << 3) + (i << 1)' pour 'i * 10' ?? – nneonneo