j'ai un programme à faire concernant les décompositions binaire, je bloque beaucoup voici l'énoncé:
On suppose dans cet exercice que l'on travaille sur des entiers non signés codés sur deux octets. Construire un programme permettant : • de saisir un tel entier, • de permuter sur choix de l'utilisateur deux demi-octets le constituant, • d'afficher le résultat.
Par exemple, pour n = 32742, on obtient la décomposition binaire : 1 2 3 4 0111 1111 1110 0110
La permutation du demi-octet 1 et du demi-octet 3 donnerait : 1 2 3 4 1110 1111 0111 0110
Le résultat serait donc ici de : 61302.
Remarques : • l'utilisation d'opérateurs de manipulation binaire est interdite, • le résultat doit être affiché en binaire et en décimal.
et voici le programme que je suis entrain de faire:
#include <stdio.h> #include <stdlib.h>
int main(int argc, char **argv) { unsigned long binairepart1=0; unsigned long binairepart2=0; unsigned long binairepart3=0; unsigned long binairepart4=0; long increment=0; int e; unsigned long binairefinal; int i=0; int interchange1; int interchange2; unsigned long numberdecimal; unsigned long numbergarde;
Le message qui suit est une réponse automatique activée par un membre de l'équipe. Les réponses automatiques leur permettent d'éviter d'avoir à répéter de nombreuses fois la même chose, ce qui leur fait gagner du temps et leur permet de s'occuper des sujets qui méritent plus d'attention. Nous sommes néanmoins ouverts et si vous avez une question ou une remarque, n'hésitez pas à contacter la personne en question par Message Privé. Pour plus d'informations, nous vous invitons à lire les règles générales du forum
Merci de colorer votre code à l'aide du bouton Code
Les forums d'Openclassrooms disposent d'une fonctionnalité permettant de colorer et mettre en forme les codes source afin de les rendre plus lisibles et faciles à manipuler par les intervenants. Pour cela, il faut utiliser le bouton de l'éditeur, choisir un des langages proposés et coller votre code dans la zone prévue. Si vous utilisez l'éditeur de messages en mode Markdown, il faut utiliser les balises <pre class="brush: cpp;">Votre code ici</pre>.
mais je n'ai pas le droit au fonction, et Ox, c'est la base 10 mais que veux dire ff?
Il n'y a aucune fonction dans le code zoup. 0x (zero suiivi de x [ou X] ) indique au compilateur que le nombre qui va suivre est de l'hexadécimal. Je te laisse donc chercher ce que veut dire 0xff
Mais hélas pour zoup, si son code est bon, il enfreint la consigne: pas d'opérateur de manipulation de bits
- Edité par edgarjacobs 18 octobre 2019 à 18:49:40
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent
Tu as regardé la proposition de PierrotLeFou ? Il me semble qu'elle correspond bien à ce que tu recherches.
C'est une solution pour permuter les demi-octets 1 et 2, il restera à généraliser aux octets i et j quelconques.
Une idée possible serait de d'abord séparer chaque demi-octet, quelque chose comme :
demi_octet[1] = nombre % 16;
reste = nombre /16;
demi_octet[2] = reste % 16;
reste = reste / 16 ;
demi_octet[3] = reste % 16;
reste = reste / 16 ;
demi_octet[4] = reste % 16;
reste = reste / 16 ;
qu'on peut bien sûr écrire de façon plus concise avec une boucle. (Mais j'écris comme les idées me viennent, tant pis pour l'optimisation.) Note que j'ai numéroté les demi-octets dans le « bon » ordre (contrairement à toi). Exemple : avec 32742 on obtient 6, 14, 15, 7 (correspondant à l'écriture hexadécimale 7ED6 si je me trompe pas).
Ensuite, on demande à l'utilisateur d'indiquer les deux numéros de demi-octets à permuter. Mettons qu'il saisisse 2 et 4 (qui correspondent à ceux que tu as numéroté 1 et 3). Il suffit alors de reconstituer le nombre après avoir permuté les éléments du tableau :
printf("Entrer les numéros à permuter : ") ;
scanf ("%u %u", &i, &j) ;
/* penser à vérifier qu'ils sont entre 1 et 4 ! */
// 1) On permute
tmp = demi_octet[i] ;
demi_octet[i] = demi_octet[j] ;
demi_octet[j] = tmp ;
// 2) On reconstitue le nombre
nombre = demi_octet[1] + 16 * (demi-octet[2]
+ 16 * (demi_octet[3]
+ 16 * demi_octet[4])) ;
(Là aussi, le 2) peut être écrit de façon plus concise avec une boucle.) Avec les valeurs 6, 14, 15, 7 que, une fois permutées, deviennent 6, 7, 15, 14, on obtient 61302.
Bref, il y a peut-être des petites erreurs, mais je pense que l'idée est bonne.
PS : désolé si j'en ai trop dit. Je suis parti de l'idée de PierrotLeFou que j'ai juste voulu généraliser, et je me suis peut-être un peu emporté. Il faut dire que je sujet est amusant !
Merci à tous pour vos réponses, j'ai donc fait le programme mais j'ai un problème, ça ne m'affiche pas le résultat que je veux c'est-à-dire le nombre decimal interchanger et le nombre binaire.
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main(int argc, char **argv)
{
unsigned long binairepart1=0;
unsigned long binairepart2=0;
unsigned long binairepart3=0;
unsigned long binairepart4=0;
unsigned int interchange1;
unsigned int interchange2;
long increment=0;
int e;
unsigned long binairefinal;
int i=0;
unsigned long numberdecimal;
unsigned long numbergarde;
unsigned long numbergarde1;
unsigned int binairedecimal;
printf("Entrez votre nombre: \n");
scanf("%lu", &numberdecimal);
numbergarde=numberdecimal;
while(numberdecimal != 0){
e= numberdecimal%2;
numberdecimal=numberdecimal/2;
e=e*ceil(pow(10,increment));
binairedecimal=e+binairedecimal;
increment++;
i++;
if(numbergarde<=15 && numberdecimal==0){
binairepart4=binairefinal;
}else{
if(i==4){
binairepart4=binairefinal;
increment=0;
e=0;
binairefinal=0;
}
if(numbergarde <= 255 && numberdecimal==0){
binairepart3=binairefinal;
}
if(i==8)
binairepart3=binairefinal;
increment=0;
e=0;
binairefinal=0;
}
printf("Entrer les numéros à permuter : ") ;
scanf ("%u %u", &interchange1, &interchange2) ;
numbergarde1= interchange1 ;
interchange1 = interchange2 ;
interchange2 = numbergarde1;
numberdecimal = binairepart1 + 16 * (binairepart2 + 16 * (binairepart3 + 16 * binairepart4));
printf("%ld", numberdecimal);
printf("%ld", binairefinal);
return 0;
}
}
Je pense que je devrais rajouter pour chaque bit, les opérateurs mathématiques pour passer du decimal en binaire, vous pensez que c'est une bonne idée?
je voulais vous demander, parce que dans mon programme, je dois convertir un nombre décimal en binaire, ça je l'ai fait mais la 2eme partie consiste à interchanger deux demi-octets( sachant qu'il y en a 4).
Par exemple: 32742 donne 1111 1111 1100 1100 et par exemple si j'échange le demi-octet 1 et le 4, ça me donne:
1100 1111 1100 1111
Mais je ne sais pas comment procéder dans le programme, pourriez-vous m'aider s'il vous plaît
Un peu "bourrin" à mon avis: tes rtx auraient avantageusement pu être remplacés par un tableau, dynamique idéalement de manière à ne pas restreindre la taille des nombres.
Du coup, tes interminables lignes dans la boucle auraient pu se ramener à 2 .
zoup, j'ai oublié de préciser que que je n'ai pas le droit au tableau
Et pourquoi ne le précises-tu que maintenant? Ca fait un moment qu'on te propose des solutions utilisant des tableaux, mais tu laisses courir. Franchement, je ne comprends pas ...
Du coup, tant qu'on y est, il y a encore d'autres trucs auxquels tu n'as pas droit?
Zoup, je n'ai pas droit aux tableaux et aux opérateurs binaires.
edgarjacobs, comment ça?
Programme binaire
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Le Tout est souvent plus grand que la somme de ses parties.
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent
Le Tout est souvent plus grand que la somme de ses parties.