calcul du nombre de bits - C - Programmation
Marsh Posté le 27-04-2005 à 17:21:15
Je suis bien sure de ce que tu veux faire donc je reponds peut etre a cote de la plaque, mais quelque soit le type utiliser tu peux utiliser sizeof. Meme si tu as defini toi meme un type grand_entier tu peux faire un sizeof(grand_entier) et ca te retourneta la taille.
Par contre si ce que tu veux c est savoir le nombre de bit minimum qu il faut pour ecire un entier precis tu peux prendre le logarithme neperien de cet entier diviser par ln(2) et l arondie superieur du resultat te donne le nombre de bits.
Par exemple si tu definit une variable byte temp sur 8 bits avec temp=10 tu auras:
sizeof(temp)=8 bits
ln(temp)/ln(2)=3.3 donc 10 s ecrira avec 4 bits.
Marsh Posté le 27-04-2005 à 17:37:51
pour le nombres de digits binaires utilisés pour codé un type il faut utilisé sizeof (qui retourne une taille en char) et la constante CHAR_BIT (nombre de bits pour un char)
size_t bit_size_int = sizeof(int) * CHAR_BIT;
Marsh Posté le 27-04-2005 à 19:09:08
ouais c est claire que sur mon sizeof j avais ete un peu leger
Marsh Posté le 28-04-2005 à 15:56:10
ben sizeof * CHAR_BIT
et j'aurais utilisé l'approximation 643 / 2136 plutot que le calcul flottant à coup de ln
Marsh Posté le 30-04-2005 à 16:12:24
Excuse moi Taz mais je ne coomprend pas bien quand tu parles de l'approximation 643/2136 tu entends quoi par la?
Marsh Posté le 30-04-2005 à 20:46:49
643/2136 est une approximation de log10(2) à 10^7. Donc ça te permet d'écrire des constantes entières sans problème
const size_t int_bits = sizeof(int) * CHAR_BIT;
const size_t int_digits10 = int_bits * 643 / 2136;
c'est quand même plus pratique que de sortir math.h et ln pour un truc simple comme cela.
Marsh Posté le 30-04-2005 à 22:57:16
Taz a écrit : 643/2136 est une approximation de log10(2) à 10^7. Donc ça te permet d'écrire des constantes entières sans problème |
Je pige pas ce que tu fais avec ton int_digits10 ensuite (ni ce qu'il représente mathématiquement d'ailleur).
Une autre solution possible (je ne sais pas laquelle est la plus efficace) :
Code :
|
Edit : attention ce bout de code ne fonctionne que pour des entiers positifs (à adapter donc pour les entiers négatifs).
Marsh Posté le 30-04-2005 à 23:04:33
int_digits10 c'est le nombre de chiffres (en base 10) qu'un entier stocké dans un int peu avoir au maximun.
ca serais pas plutot
const size_t int_digits10 = int_digits * 643 / 2136;
avec
const size_t int_digits = int_bits - 1;
mais si dans ce cas ca ne change rien
Marsh Posté le 30-04-2005 à 23:37:26
skelter a écrit : int_digits10 c'est le nombre de chiffres (en base 10) qu'un entier stocké dans un int peu avoir au maximun. |
Ah oui, bien sûr. Mais la question de départ m'avait plutôt l'air d'être : comment connaître le nombre de chiffres d'un entier en base 2 (nombre qui dépend de l'entier en question), et non pas : comment connaître le nombre de bits nécessaires en C pour coder un entier (qui est une constante qui dépend de la plateforme).
Avec la méthode de niemad (purement mathématique), on est bien obligé de calculer un logarithme du nombre, non ?
Sinon il reste la méthode que j'ai postée plus haut.
Marsh Posté le 01-05-2005 à 09:39:33
et on pourrais faire la meme chose pour le nombre de chiffres en base 10, tmp /= 10
Marsh Posté le 01-05-2005 à 19:42:18
Merci à tout le monde pour votre aide.
Bonne fin journee à vous tous!
Marsh Posté le 04-05-2005 à 22:40:11
alerim sans vouloir abuse de ta gentillesse tu pourrais m expliquer ton code stp? enfin la methode que tu utilises
Marsh Posté le 04-05-2005 à 22:45:16
aurelien_44 a écrit : excusez moi de vous derangez mais ca veut dire quoi |
machin >>= n; |
équivaut à :
machin = machin >> n; |
Qui réalise un décalage vers la droite de n bits sur machin.
Lire le K&R (le livre de Kernighan et Ritchie) serait un bon début...
Marsh Posté le 27-04-2005 à 16:35:17
Bonjour,
j aimerais savoir comment on peut calculer le nombre
bits necessaire pour ecrire un entier n.
Je sais qu en C il y a sizeof mais comment peut
on faire lorsqu on travaille sur de grands entiers?