nombre de bits d'un nombre

nombre de bits d'un nombre - C - Programmation

Marsh Posté le 30-04-2007 à 13:36:11    

comment faire pour obtenir le nombre de bit d'un entier a en C

Reply

Marsh Posté le 30-04-2007 à 13:36:11   

Reply

Marsh Posté le 30-04-2007 à 13:38:53    

what?


---------------
I mean, true, a cancer will probably destroy its host organism. But what about the cells whose mutations allow them to think outside the box, and replicate and expand beyond their wildest dreams by throwing away the limits imposed by overbearing genetic r
Reply

Marsh Posté le 30-04-2007 à 13:40:39    

par exemple 32 en base 10 s'écrit 10000 en base 2, ce qu ej evoudrais faire c'est entré a=14689753 en base 10 et que la fonction me donne le nombre de chiffre en base 2 de cet entier a

Reply

Marsh Posté le 30-04-2007 à 13:53:01    

En comparant par rapport à la puissance de 2 la plus proche.

Reply

Marsh Posté le 30-04-2007 à 13:53:06    

CHAR_BIT * sizeof int
oups, c'est la réponse au premier post


Message édité par Trap D le 30-04-2007 à 13:54:41
Reply

Marsh Posté le 30-04-2007 à 13:54:52    

[:petrus75]
 
Oui et donc?


---------------
I mean, true, a cancer will probably destroy its host organism. But what about the cells whose mutations allow them to think outside the box, and replicate and expand beyond their wildest dreams by throwing away the limits imposed by overbearing genetic r
Reply

Marsh Posté le 30-04-2007 à 14:00:03    

Il n'y a pas cette formule qui donne le nombre de chiffres d'une nombre m dans une base n : ln(m)/ln(n)+1 ?

Reply

Marsh Posté le 30-04-2007 à 14:11:07    

Trap D a écrit :

Il n'y a pas cette formule qui donne le nombre de chiffres d'une nombre m dans une base n : ln(m)/ln(n)+1 ?


J'aurais du quoter, je répondais à son second post en fait, pas au tiens :o

 

désolé :o


Message édité par masklinn le 30-04-2007 à 14:11:38

---------------
I mean, true, a cancer will probably destroy its host organism. But what about the cells whose mutations allow them to think outside the box, and replicate and expand beyond their wildest dreams by throwing away the limits imposed by overbearing genetic r
Reply

Marsh Posté le 01-05-2007 à 01:26:26    

si tu peux éviter de sortir 2 ln, et que tu fais le truc simple avec des >> & c'est mieux non ? voire sans boucle ou carrément si ton processeur a ça avec un cntlwz

Reply

Marsh Posté le 01-05-2007 à 03:14:45    

Code :
  1. while(c){
  2.   nb_bits+=c&1;
  3.   c = c>>1;
  4. }


 
jai fais ca comme ca c a verifier

Reply

Marsh Posté le 01-05-2007 à 03:14:45   

Reply

Marsh Posté le 01-05-2007 à 08:43:04    

Là tu comptes le nombre de bits à 1 dans c, pas le nombre de chiffres dans la représentation binaire.

Reply

Marsh Posté le 01-05-2007 à 13:15:48    

Sans les mains, celà donne...

Code :
  1. int foo(int val) {
  2. union { float f; int i; } bar = { (float)val };
  3. int exp = (bar.i >> 23) & 0xff;
  4. return exp >= 127 ? exp-127+1 : 0;
  5. }


Reply

Marsh Posté le 01-05-2007 à 17:48:10    

Reply

Marsh Posté le 01-05-2007 à 18:48:25    

mormegil92 a écrit :

par exemple 32 en base 10 s'écrit 10000 en base 2, ce qu ej evoudrais faire c'est entré a=14689753 en base 10 et que la fonction me donne le nombre de chiffre en base 2 de cet entier a


 
ltoa() , c'est pas fait pour les chiens...

Reply

Marsh Posté le 01-05-2007 à 18:49:48    

marctes a écrit :

ltoa() , c'est pas fait pour les chiens...


itoa c'est pas standard.


---------------
I mean, true, a cancer will probably destroy its host organism. But what about the cells whose mutations allow them to think outside the box, and replicate and expand beyond their wildest dreams by throwing away the limits imposed by overbearing genetic r
Reply

Marsh Posté le 01-05-2007 à 19:40:23    


log2 par extraction - non portable - de l'exposant - du flottant correspondant - qui se trouve être "le nombre de chiffre en base 2 de cet entier", bit de signe non compris.


Message édité par tbp le 01-05-2007 à 19:41:16
Reply

Marsh Posté le 02-05-2007 à 00:31:02    

ça j'avais cru comprendre, mais je ne vois aucun intérêt à cette méthode ...

Reply

Marsh Posté le 02-05-2007 à 03:17:50    

C'est pourtant évident: O(1) , pas de table, pas de boucle, un minimum d'operations (load/store/shift/add) et nul besoin de se battre avec l'asm inline (ou les builtins spécifiques à chaque compilo) pour taquiner le bsr ou équivalent. Le tout est vectorisable.
 
Note: il y a d'autre façon de détourner les flottants pour le même résultat.  

Reply

Marsh Posté le 02-05-2007 à 04:19:20    

La taille d'un entier étant fixe y'a pas franchement de raison de parler de complexité :o


---------------
Me: Django Localization, Yogo Puzzle, Chrome Grapher, C++ Signals, Brainf*ck.
Reply

Marsh Posté le 02-05-2007 à 08:15:48    

0x90 a écrit :

La taille d'un entier étant fixe y'a pas franchement de raison de parler de complexité :o


Voilà voilà. Je saisis mal ce fétichisme pour les boucles, qui n'est justifiable ni par la vitesse d'exécution ni la concision mais si c'est votre truc qui suis-je pour juger. Surtout, on a vu chose plus intéressante à débattre.

Reply

Marsh Posté le 02-05-2007 à 10:26:16    

0x90 a écrit :

La taille d'un entier étant fixe y'a pas franchement de raison de parler de complexité :o


Ca, c'est vrai que dans les langages pour pervers psychopathes genre le C :o


---------------
I mean, true, a cancer will probably destroy its host organism. But what about the cells whose mutations allow them to think outside the box, and replicate and expand beyond their wildest dreams by throwing away the limits imposed by overbearing genetic r
Reply

Marsh Posté le 02-05-2007 à 12:43:34    

masklinn a écrit :

Ca, c'est vrai que dans les langages pour pervers psychopathes genre le C :o


 
Ça tombe bien c'est un topic C :)


---------------
Me: Django Localization, Yogo Puzzle, Chrome Grapher, C++ Signals, Brainf*ck.
Reply

Marsh Posté le 02-05-2007 à 13:48:26    

matafan a écrit :

Là tu comptes le nombre de bits à 1 dans c, pas le nombre de chiffres dans la représentation binaire.


non pas du tout, il répond exactement à la question posée : il compte le nombre de bits significatifs.
 
attention toutefois, pour un nombre négatif, la valeur sera toujours de sizeof(var) * 8 (il faudra penser à faire un Abs() avant)
 
sinon, je suppose que le but du jeu ici, c'est, à partir d'un nombre de taille inconnue (par exemple, une saisie utilisateur) stocké dans une variable de grande taille, de détecter le plus petit type possible pour le stocker non ?
 
en C, je ne sais pas s'il y a des constantes "MIN" et "MAX" pour un type donné.
 
Mettons ici le code C#, à traduire selon les besoins (quitte à mettre les constantes en dur, de toute façon elles sont normalement figées) :
 

Code :
  1. Int64 nbr = 1234567890; // Nombre saisi par l'utilisateur
  2.  
  3. if (Math.Abs(nbr) > (Int64)Int32.MaxValue)
  4. {
  5.    Console.WriteLine("On peut représenter ce nombre en 64 bits" );
  6. }
  7. else if (Math.Abs(nbr) > (Int64)Int16.MaxValue)
  8. {
  9.    Console.WriteLine("On peut représenter ce nombre en 32 bits" );
  10. }
  11. else if (Math.Abs(nbr) > (Int64)byte.MaxValue)
  12. {
  13.    Console.WriteLine("On peut représenter ce nombre en 16 bits" );
  14. }
  15. else
  16. {
  17.    Console.WriteLine("On peut représenter ce nombre en 8 bits" );
  18. }

Message cité 1 fois
Message édité par MagicBuzz le 02-05-2007 à 13:56:26
Reply

Marsh Posté le 02-05-2007 à 17:59:45    

MagicBuzz a écrit :

non pas du tout, il répond exactement à la question posée : il compte le nombre de bits significatifs.


Ben non, il ajoute c&1 au lieu de 1. Donc il compte le nombre de bits à 1.

Reply

Marsh Posté le 02-05-2007 à 20:03:57    

Ah oui effectivement.
Je suis pas habitué aux notations C à la con :spamafote: Il faut faire ++ et non coller le résultat d'un masque :jap:

Reply

Marsh Posté le 02-05-2007 à 20:05:56    

Parcequ'en C# y'a pas de & ptêtre ?


---------------
Me: Django Localization, Yogo Puzzle, Chrome Grapher, C++ Signals, Brainf*ck.
Reply

Marsh Posté le 02-05-2007 à 20:26:46    

0x90 a écrit :

Parcequ'en C# y'a pas de & ptêtre ?


c'est pas parceque C# a hérité d'une tétrachiée de conneries issues du C que je les utilise :p

Reply

Marsh Posté le 04-05-2007 à 15:09:45    

MagicBuzz a écrit :

c'est pas parceque C# a hérité d'une tétrachiée de conneries issues du C que je les utilise :p


 
Ouaip t'as raison. Il y a des dizaines de programmeurs qui se sont cassés le cul à introduire des outils en C comme la manipulation d'adresses, de bits ou autres hyper sympas (évidemment faut avoir un peu de jugeotte quand on les utilise) et voilà comment on les traite. Retourne au COBOL... :sol:


Message édité par Sve@r le 04-05-2007 à 15:10:16

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 04-05-2007 à 15:33:31    

ca aussi ca marche...c'est même plus rapide.
 

Code :
  1. int nb_bit( int i){
  2. int nb = 0;
  3. while( i ){
  4.  i &=  i - 1;
  5.  nb++;
  6. }
  7. return nb;
  8. }

Reply

Marsh Posté le 04-05-2007 à 23:38:19    

slvn a écrit :

ca aussi ca marche...c'est même plus rapide.
 

Code :
  1. int nb_bit( int i){
  2. int nb = 0;
  3. while( i ){
  4.  i &=  i - 1;
  5.  nb++;
  6. }
  7. return nb;
  8. }



Je n'arrive pas à trouver le principe mathématique qui a donné cet algo. Par ailleurs, je pense qu'il ne correspond pas à la question initiale
En effet, si on le déroule "à la main" sur le nombre 10 (1010 en binaire), alors on obtient ceci
- itération 1: i=i & (i - 1) => i= 1010 & 1001 = 1000 et nb passe à 1
- itération 2: i=i & (i - 1) => i= 1000 & 0111 = 0000 et nb passe à 2
i vaut 0 => fin de boucle => nb final vaut 2
 
Apparemment, cet algo te donne le nombre de bits à 1 d'un nombre (j'ai testé avec 11 et avec 6) mais le sujet initial était "avoir le nombre de bits total". Ceci dit, il est quand-même joli...


Message édité par Sve@r le 05-05-2007 à 09:25:15

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 04-05-2007 à 23:54:08    

Allez, je participe aussi

Code :
  1. int nbbit(int x)
  2. {
  3. int nb = 0;
  4. while(x > 0)
  5. {
  6.  nb++;
  7.  x >>= 1;
  8. }
  9. return nb;
  10. }

Ne marche pas pour x = 0 .


Message édité par Trap D le 04-05-2007 à 23:58:45
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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