Comment obtenir le n-ième chiffre d'un nombre entier avec bit-wise opérations?
Exemple. 123456, et nous voulons le troisième en partant de la droite ('4') sur.
L'idée dans la pratique, est d'accéder à chaque chiffre séparément (c'est à dire. 6 5 4 3 2 1).
C/C++/C# préféré.
- Vous avez besoin de préciser - vous êtes à la recherche pour les chiffres décimaux? Si oui, bit-wise opérations ne sont pas appropriées. Vous êtes à la recherche pour le binaire, octal ou hexadécimal chiffres? Si oui, alors le bit à bit les opérations sont appropriés. Aussi, ils sont "entiers", et non pas 'entier' (titre).
Vous devez vous connecter pour publier un commentaire.
Une application plus efficace pourrait être quelque chose comme ceci:
Cela permet d'économiser l'effort de convertir tous les chiffres de format de chaîne si vous voulez seulement l'un d'entre eux. Et, vous n'avez pas à allouer de l'espace pour la chaîne convertie.
Si la vitesse est un problème, vous pourriez précalculer une gamme de puissances de 10 et de l'utilisation n de l'indice dans ce tableau:
Comme mentionné par d'autres, ce qui est aussi proche que vous allez arriver à des opérations bit à bit pour la base 10.
0
).Utiliser en base 10 maths:
Produit:
Juste passé du temps à écrire ce basées sur les réponses ici, donc pensé que je voudrais partager.
Ceci est basé sur Brannon réponse, mais vous permet d'obtenir plus d'un chiffre à la fois. Dans mon cas je l'utilise pour extraire des parties de la date et l'heure enregistrées dans un int où les chiffres sont en yyyymmddhhnnssm_s format.
Je l'ai fait une extension, vous ne voulez pas vous, mais voici un exemple d'utilisation:
résultats:
année = 2001
mois = 6
jour = 7
La raison qu'il ne fonctionne pas (facilement) avec bit-wise opérations est que la base du système décimal (10) n'est pas une puissance de la base du système binaire (2).
Si vous étiez le codage en base 8, vous auriez
pow(2, 3) == 8
, et pourrait en extraire chaque chiffre octal comme un bloc de trois bits.Si vous avez vraiment à convertir en base 10, ce qui est habituellement fait par la conversion d'une chaîne de caractères (avec toString (Java) ou sprintf (C), comme d'autres l'ont indiqué dans leurs réponses).
Cela fonctionne pour les entiers non signés jusqu'à 451069, comme expliqué ici:
La tester:
Je serais surpris si c'est plus rapide, cependant. Peut-être que vous devriez reconsidérer votre problème.
if (R >= 10) { R = R - 10; Q = Q + 1; }
à Côté de cela, je vous remercie pour votre réponse, il m'a beaucoup aidé!valeur = (nombre % (10^position)) /10^(position 1)
Exemple:
nombre = 23846
position = 1 -> valeur = 6
position = 2 -> valeur = 4
position = 3 -> valeur = 8
Ici est une simple Objective-C d'utilité méthode pour ce faire:
Vous pouvez essayer un bit à bit shift-gauche (pour N-1), puis lire le chiffre [0], ce qui pourrait être un assembleur approche.
123456 -> 456 -> lire le premier chiffre
Code suivant va donner le n-ième digit de droite dans un certain nombre:
Juste pour le fun, voici le C# extension de classe:
Utilisation:
à deux chiffres de la d1 et la d2 sera passé .le programme doit imprimer le n-ième Nombre est le nombre de système de composés uniquement de chiffres avec d1 et d2
format d'entrée
la première ligne contient d1
la deuxième ligne contient d2
troisième kiné contenir n
d1 n'est pas égal à d2
En C, vous pourriez faire quelque chose comme le suivant, où n=0 indique le chiffre droite
Changement [19-x] à [20-x] si vous voulez n=1 pour le chiffre droite.