Retrouver les nombres qui composent un chiffre en binaire.

Retrouver les nombres qui composent un chiffre en binaire. - Algo - Programmation

Marsh Posté le 06-01-2011 à 09:37:21    

Bonjour je cherche une facon simple (j'en ai trouvé plusieurs mais ca doit pouvoir etre plus sympa) pour connaitre les nombres decimales qui composent un binaire
 
exemple  
1011 c'est 8+2+1
 
j'ai trouvé en inversant le chiffre et prenant l'index du tableau pour le mettre à la puissance 2 (si different de 0) mais c'est pas forcement des plus 'parlant'
 
Exemple
1011 => 1101
tableau  [index] [valeur]
[0][1]
[1][1]
[2][0]
[3][1]
 
donc  
1x2^0
1*2^1
--0*2^2 //exclure car = 0
1*2^3

Reply

Marsh Posté le 06-01-2011 à 09:37:21   

Reply

Marsh Posté le 06-01-2011 à 12:25:38    

Bonjour,
 

Citation :

connaitre les nombres decimales qui composent un binaire


Désolé, mais je ne comprends pas bien :
 
- Les "nombres" ou les "chiffres" ?
- Les "nombres décimales" ou les "nombres décimaux", ou la "partie décimale d'un nombre décimal" ?
- Un "binaire" ? Ce mot peut avoir plusieurs significations. Par exemple, il peut désigner un programme. Mais ici, je devine qu'il s'agit d'un "nombre écrit en notation binaire" ou plutôt d'une chaîne de caractères composées des caractères "0" et 1".
 

Citation :

1011 c'est 8+2+1


Désolé, je ne comprends pas bien :
 
- L'expression "c'est" n'est pas claire.
Est-ce qu'il faut trouver 1011 à à partir de 11 ou bien trouver 11 à partir de 1011 ?
 

Citation :

c'est pas forcement des plus 'parlant'


Désolé, je ne comprends pas bien :
 
- Est-ce que la priorité est de faire un algorithme qui marche ou un algorithme qui est "parlant" (avec des guillemets comme c'est l'usage en français et en anglais des Etats Unis, les apostrophes étant l'usage en anglais du Royaume Uni) ?
 
Je crois qu'il faut utiliser les puissance de 2 d'une manière ou d'une autre. Je ne vois pas bien comment faire autrement et pourquoi ne pas s'en servir. Sinon, on pourrait utiliser les décalages, mais je ne sais si cela fait partie de votre cours.


Message édité par olivthill le 06-01-2011 à 12:26:23
Reply

Marsh Posté le 06-01-2011 à 13:13:32    

Je cherche les chiffres décimales qui le composent
 
1011 est composé en décimal de 8-2-1

Reply

Marsh Posté le 06-01-2011 à 14:10:12    

Les "chiffres décimales" ?
 
S'il vous plait, regardez dans un dictionnaire de français.
 
Il existe l'adjectif "décimal", et alors il faut dire les "chiffres décimaux"
 
Il existe aussi le nom "décimal", et alors cela n'a aucun sens en français de mettre deux noms communs l'un à la suite de l'autre. C'est comme si vous disiez la "musique chant", ou le "piano longueur".

Reply

Marsh Posté le 06-01-2011 à 16:09:25    

Sebastien a écrit :

Bonjour je cherche une facon simple (j'en ai trouvé plusieurs mais ca doit pouvoir etre plus sympa) pour connaitre les nombres decimales qui composent un binaire
 
exemple  
1011 c'est 8+2+1
 
j'ai trouvé en inversant le chiffre et prenant l'index du tableau pour le mettre à la puissance 2 (si different de 0) mais c'est pas forcement des plus 'parlant'
 
Exemple
1011 => 1101
tableau  [index] [valeur]
[0][1]
[1][1]
[2][0]
[3][1]
 
donc  
1x2^0
1*2^1
--0*2^2 //exclure car = 0
1*2^3


 
 
Pas très clair en effet. Un nombre binaire est composé de chiffres binaires (0 ou 1). Un nombre décimal est composé de chiffres décimaux (0, 1, 2, ..., 9). Mais bon je suppose que tu veux transformer un nombre décimal en binaire.  Dans ce cas, il suffit de faire une simple division. L'algo donne quelque chose du genre:

Code :
  1. index = 0;
  2. tantque (nombreDécimal > 0) faire
  3.    tableau[index] = nombreDecimal modulo 2
  4.    nombreDécimal = nombreDécimal div 2      --> division entière
  5.    incrémenter index
  6. fin tantque


 
L'algorithme peut facilement s'étendre à n'importe quelle base, il suffit de remplacer la valeur 2 par la base souhaitée. Il faut juste considérer que pour les bases supérieures à 10, il faut des "nouveaux" chiffres (par exemple 'A', 'B', 'C', 'D', 'E' et 'F' pou la base 16).
 
Pour a conversion inverse c'est un poil plus compliqué (mais juste un poil). Par exemple tu peux regarder le schéma de Horner qui donne par exemple pour le nombre binaire 1011 le calcule
 
nombreDecimal = (((1*2)+0)*2 + 1)*2 + 1

Reply

Marsh Posté le 06-01-2011 à 17:07:52    

Moi je comprend qu'il veut afficher les puissances de 2 dont la somme donne son nombre.

 

Un truc comme ça quoi:

Code :
  1. Index <- 1
  2. Tant que nombre est différent de 0
  3. Faire
  4.    Si nombre modulo 2 est différent de 0
  5.    Alors
  6.       Afficher Index
  7.    Fin Si
  8.    Index <- Index * 2
  9.    Nombre <- Nombre / 2 
  10. Fin Faire


Message édité par h3bus le 06-01-2011 à 17:08:20

---------------
sheep++
Reply

Marsh Posté le 06-01-2011 à 20:49:21    

H3bus est le plus proche meme si à premiere vue son algo me parait bizarre, mais à tester, ou à arranger je vois son idée et oui ca pourrait etre une piste.
 
Donc pour faire simple
J'ai 101 je veux afficher  
4
1
 
 
 
Pour la petite histoire
J'ai une base qui gère un questionnaire à choix multiple, sur des volumes conséquents.
 
Et le système est composé ainsi :
[pre]
ID - Réponse
1     Choix 1
2     Choix 2
4     Choix 3
8     Choix 4
16   Choix 5
.....
512 Choix 10
 
 
Et donc la 'table' des réponses est :
 
User - Reponses
1        4
2        27
3        954
....
[/pre]
 
Exemple l utilisateur 2 à choisit les réponses choix 5 (valeur 16) choix 4 (valeur 8) choix 2 (valeur 2) choix 1 (valeur 1) 16+8+2+1 = 27
 
On evite ainsi d'avoir pour chaque membres x lignes et on réduit la volumetrie d'autant plus.
 
Et donc je cherchais comment faire une correspondance entre les 2.
Mon idée fut donc pour pas m'embeter d'utiliser une table de transcodage entre les 2 systèmes, qui contiendrait donc les 1023 combinaisons possibles
 
Au final il existe en sql (enfin j'utilise sql server 2008 je sais pas trop si c'est standard) une fonction '&' qui permet de faire la liaison entre les 2
une jointure du type  

Citation :

user & id = id


 
Mais bon je veux quand meme savoir en Algo comment retransformer ca.

Reply

Marsh Posté le 06-01-2011 à 23:14:39    

voilà typiquement le genre d'optimisation qui fait perdre plus de temps au final. Une table n-n entre user et choix auraient été certes plus grosse mais 100 x plus efficace à inner-jointurer (et je parle même pas des contraintes d'intégrité)
 
Le cas d'école. Faut il rappeler que les optimisations ça se fait APRES avoir fait des benchmark et pas juste au pifomètre "ouais ça va être gros"


Message édité par smaragdus le 06-01-2011 à 23:15:08
Reply

Marsh Posté le 07-01-2011 à 10:33:57    

Justement non vu que c'est natif au code SQL en fait donc en terme de performance on y perd pas.
La par la suite c'est pour ma culture 'algo' que je me posais la question

 

http://msdn.microsoft.com/en-us/library/ms174965.aspx
ca semble exister partout (mysql oracle par exemple)
Assez marrant les fonctions
genre
SELECT 29 | 15;
SELECT 29 & 15;


Message édité par Sebastien le 07-01-2011 à 11:03:38
Reply

Marsh Posté le 08-01-2011 à 15:28:14    

La facon, la plus sera de faire ca:
Si tu veux savoir si ton utilisateur a repondu a la question N:

if (Reponse & (1 << (N-1))) then
  Il a repondu
endif


Message édité par Olivier51 le 08-01-2011 à 15:28:35
Reply

Sujets relatifs:

Leave a Replay

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