Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
754 connectés 

  FORUM HardWare.fr
  Programmation
  C

  nombre de bits d'un nombre

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

nombre de bits d'un nombre

n°1551431
mormegil92
Posté le 30-04-2007 à 13:36:11  profilanswer
 

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

mood
Publicité
Posté le 30-04-2007 à 13:36:11  profilanswer
 

n°1551433
masklinn
í dag viðrar vel til loftárása
Posté le 30-04-2007 à 13:38:53  profilanswer
 

what?


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
n°1551434
mormegil92
Posté le 30-04-2007 à 13:40:39  profilanswer
 

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

n°1551439
olivthill
Posté le 30-04-2007 à 13:53:01  profilanswer
 

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

n°1551440
Trap D
Posté le 30-04-2007 à 13:53:06  profilanswer
 

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
n°1551442
masklinn
í dag viðrar vel til loftárása
Posté le 30-04-2007 à 13:54:52  profilanswer
 

[:petrus75]
 
Oui et donc?


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
n°1551445
Trap D
Posté le 30-04-2007 à 14:00:03  profilanswer
 

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 ?

n°1551461
masklinn
í dag viðrar vel til loftárása
Posté le 30-04-2007 à 14:11:07  profilanswer
 

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
n°1551713
Taz
bisounours-codeur
Posté le 01-05-2007 à 01:26:26  profilanswer
 

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

n°1551714
red factio​n
Posté le 01-05-2007 à 03:14:45  profilanswer
 

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


 
jai fais ca comme ca c a verifier

mood
Publicité
Posté le 01-05-2007 à 03:14:45  profilanswer
 

n°1551724
matafan
Posté le 01-05-2007 à 08:43:04  profilanswer
 

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

n°1551807
tbp
Posté le 01-05-2007 à 13:15:48  profilanswer
 

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


n°1551862
Taz
bisounours-codeur
Posté le 01-05-2007 à 17:48:10  profilanswer
 
n°1551881
marctes
Posté le 01-05-2007 à 18:48:25  profilanswer
 

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

n°1551882
masklinn
í dag viðrar vel til loftárása
Posté le 01-05-2007 à 18:49:48  profilanswer
 

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
n°1551916
tbp
Posté le 01-05-2007 à 19:40:23  profilanswer
 


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
n°1551989
Taz
bisounours-codeur
Posté le 02-05-2007 à 00:31:02  profilanswer
 

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

n°1551999
tbp
Posté le 02-05-2007 à 03:17:50  profilanswer
 

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.  

n°1552000
0x90
Posté le 02-05-2007 à 04:19:20  profilanswer
 

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.
n°1552021
tbp
Posté le 02-05-2007 à 08:15:48  profilanswer
 

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.

n°1552077
masklinn
í dag viðrar vel til loftárása
Posté le 02-05-2007 à 10:26:16  profilanswer
 

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
n°1552243
0x90
Posté le 02-05-2007 à 12:43:34  profilanswer
 

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.
n°1552285
MagicBuzz
Posté le 02-05-2007 à 13:48:26  profilanswer
 

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
n°1552535
matafan
Posté le 02-05-2007 à 17:59:45  profilanswer
 

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.

n°1552570
MagicBuzz
Posté le 02-05-2007 à 20:03:57  profilanswer
 

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:

n°1552572
0x90
Posté le 02-05-2007 à 20:05:56  profilanswer
 

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


---------------
Me: Django Localization, Yogo Puzzle, Chrome Grapher, C++ Signals, Brainf*ck.
n°1552586
MagicBuzz
Posté le 02-05-2007 à 20:26:46  profilanswer
 

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

n°1555401
Sve@r
Posté le 04-05-2007 à 15:09:45  profilanswer
 

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.
n°1555427
slvn
Posté le 04-05-2007 à 15:33:31  profilanswer
 

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

n°1555593
Sve@r
Posté le 04-05-2007 à 23:38:19  profilanswer
 

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.
n°1555598
Trap D
Posté le 04-05-2007 à 23:54:08  profilanswer
 

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
mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  nombre de bits d'un nombre

 

Sujets relatifs
Améliorer la vitesse du fonction donnant un nombre aléatoirecomment augmenter le nombre de jointure sur mysql??
nombre max d'image par ligneProcesseur 32 bits - Qesako
[VBSCRIPT] nombre ?Creation de fichier binaire->choix du nombre de bits
calcul du nombre de bitsun nombre de 1024 bits fait combien de chiffres ?
[C++] representer un nombre 64 bits[RESOLU]Convertir un entier en HEXA sur un nombre de bits
Plus de sujets relatifs à : nombre de bits d'un nombre


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR