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?


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
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?


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
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

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
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.


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
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


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
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