nombre de bits d'un nombre - C - Programmation
Marsh Posté le 30-04-2007 à 13:38:53
what?
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
Marsh Posté le 30-04-2007 à 13:53:01
En comparant par rapport à la puissance de 2 la plus proche.
Marsh Posté le 30-04-2007 à 13:53:06
CHAR_BIT * sizeof int
oups, c'est la réponse au premier post
Marsh Posté le 30-04-2007 à 13:54:52
Oui et donc?
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 ?
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
désolé
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
Marsh Posté le 01-05-2007 à 03:14:45
Code :
|
jai fais ca comme ca c a verifier
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.
Marsh Posté le 01-05-2007 à 13:15:48
Sans les mains, celà donne...
Code :
|
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...
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.
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.
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 ...
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.
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é
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é |
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.
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é |
Ca, c'est vrai que dans les langages pour pervers psychopathes genre le C
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 |
Ça tombe bien c'est un topic C
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 :
|
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.
Marsh Posté le 02-05-2007 à 20:03:57
Ah oui effectivement.
Je suis pas habitué aux notations C à la con Il faut faire ++ et non coller le résultat d'un masque
Marsh Posté le 02-05-2007 à 20:05:56
Parcequ'en C# y'a pas de & ptêtre ?
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
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 |
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...
Marsh Posté le 04-05-2007 à 15:33:31
ca aussi ca marche...c'est même plus rapide.
Code :
|
Marsh Posté le 04-05-2007 à 23:38:19
slvn a écrit : ca aussi ca marche...c'est même plus rapide.
|
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...
Marsh Posté le 04-05-2007 à 23:54:08
Allez, je participe aussi
Code :
|
Ne marche pas pour x = 0 .
Marsh Posté le 30-04-2007 à 13:36:11
comment faire pour obtenir le nombre de bit d'un entier a en C