2012-10-17 5 views
2

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?

+6

Les compilateurs peuvent optimiser ... pourquoi les gens pensent qu'ils ont besoin de faire '(i << 3) + (i << 1)' pour 'i * 10' ?? – nneonneo

Répondre

7

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.

2

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 '].

1

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.

+0

Très utile. Cela m'a aidé mieux que la réponse acceptée. Merci! –