calcul du nombre de bits

calcul du nombre de bits - C - Programmation

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?

Reply

Marsh Posté le 27-04-2005 à 16:35:17   

Reply

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.

Reply

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;

Reply

Marsh Posté le 27-04-2005 à 17:47:18    

Merci pour votre aide à tout les deux!

Reply

Marsh Posté le 27-04-2005 à 17:56:04    

ouf, j'ai failli faire une attaque.

Reply

Marsh Posté le 27-04-2005 à 18:03:47    

643 / 2136 est également une bonne approximation

Reply

Marsh Posté le 27-04-2005 à 19:09:08    

ouais c est claire que sur mon sizeof j avais ete un peu leger :ange:

Reply

Marsh Posté le 28-04-2005 à 15:52:16    

tu aurais fait comment taz pour resoudre mon probleme?

Reply

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

Reply

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?

Reply

Marsh Posté le 30-04-2005 à 16:12:24   

Reply

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.

Reply

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


 
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 :
  1. unsigned int tmp = n;
  2. int bits = 0;
  3. while (tmp) {
  4.     tmp >>= 1;
  5.     bits++;
  6. }
  7. printf("%d\n", bits);


 
Edit : attention ce bout de code ne fonctionne que pour des entiers positifs (à adapter donc pour les entiers négatifs).


Message édité par Profil supprimé le 30-04-2005 à 23:47:24
Reply

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

Reply

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. :D


Message édité par Profil supprimé le 30-04-2005 à 23:38:36
Reply

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

Reply

Marsh Posté le 01-05-2005 à 19:42:18    

Merci à tout le monde pour votre aide.
Bonne fin journee à vous tous!

Reply

Marsh Posté le 04-05-2005 à 22:38:20    

excusez moi de vous derangez mais ca veut dire quoi
>>=?

Reply

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

Reply

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

Reply

Marsh Posté le 05-05-2005 à 15:36:53    

ok merci

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed