Comment Entier.parseInt(string) fonctionnent-ils réellement?
Cette question fut posée récemment et ne connaît pas la réponse. D'un niveau élevé, quelqu'un peut m'expliquer comment Java prend un caractère de la Chaîne et de le convertir en int.
Merci beaucoup
Karl
Edit: Serait bon de savoir si les autres langues d'un même type de chose.
- Vous pourriez casser
src.zip
et de voir par vous-même (pour un particulier de mise en œuvre). - J'ai mis à jour la réponse avec un exemple sur la soustraction de codes
Vous devez vous connecter pour publier un commentaire.
Généralement, cela se fait comme ceci:
Modifier: Cela fonctionne pour n'importe quelle base si vous remplacez 10 avec la bonne base et d'ajuster l'obtention de le chiffre le caractère correspondant (devrait fonctionner comme pour les bases inférieur à 10, mais aurait besoin d'un peu d'ajustement pour hausse des bases comme hexadécimal - étant donné que les lettres sont séparées les nombres de 7 caractères).
Edit 2: Char à chiffres de la valeur de conversion: les caractères '0' à '9' ont des valeurs ASCII 48 à 57 (0x30 à 0x39 en hexa), dans le but de convertir un caractère à la son chiffre de la valeur d'une simple soustraction est nécessaire. Habituellement, il est fait de cette manière (où l'ord est la fonction qui donne le code ASCII du caractère):
Pour le plus grand nombre de bases que les lettres sont utilisés comme des "chiffres" (A-F en hexa), mais des lettres à partir de 65 (0x41 hexa), ce qui signifie qu'il y a une lacune que nous devons tenir compte:
Exemple: "B" est de 66, alors ord('B') - ord('0') = 18. Depuis le 18 est plus grand que 9 nous soustraire 7 et le résultat final sera 11 - la valeur du 'chiffre' B.
Plus qu'une chose à noter ici - cela fonctionne uniquement pour les lettres majuscules, de sorte que le nombre doit d'abord être convertie en majuscules.
Le code source de l'API Java est disponible gratuitement. Voici la méthode parseInt (). C'est un peu long parce qu'il a à gérer une grande quantité d'exceptionnel et coin affaires.
Je ne suis pas sûr de ce que vous cherchez, en tant que "haut niveau". Je vais faire un essai:
total = (total x 10) + current
result = 0
( int j=maxSize, i =0 ; j > 0; j--, i++)
int digit = Character.digit(s.charAt(i))
result= result + digit * (10 power j-1)
c'est mon simple mise en œuvre de
parse int
Voici ce que j'ai trouvé (Note de: Aucune vérification n'est faite pour les alphabets)