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