voilà, je suis un élève de bts iris et pour le cours d'informatique industriel, nous devons créer un convertisseur décimal binaire avec une boucle, ma question est comment récupérer la conversion binaire svp ?
Voila le source:
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int nombreDec, reste, coefficient;
coefficient=128;
printf("Entrer un nombre decimal:");
scanf("%d",&nombreDec);
do
{
reste=nombreDec-coefficient;
coefficient= coefficient/2;
}
while(coefficient=1);
printf("La cnversion de %d n binaire est:\n",nombreDec);
return 0;
}
(n & 1) donnera la valeur du dernier bit de n.
(n >> 1) décalera n de 1 bit vers la droite. (En gros, on supprime un bit. Par contre, je ne sais pas si la norme précise que le bit mis à gauche est obligatoirement à 0)
Ceci dans une boucle, on peux facilement trouver la conversion binaire de n.
Bonsoir,
d'abord, évites de mettre "Entrer un nombre décimal : " alors que deux lignes avant tu déclares un type int. De plus, dans le scanf, tu utilises %d donc tu attends un nombre entier ...
Sinon, si tu es très chanceux =) , tu peux essayer ce programme, je l'ai écrit quand j'étais fatigué pour le fun, il marche presque que pour zéro (petite dédicace au siteduzero ^^)
// Un programme pour les chanceux
// Seul zéro est trouvé rapidement.
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
const int MAX = 1, MIN = 0;
// Déclaration des variables
int nombreEnt = 0, nombre_essay = 0, i = 0, n0 = 0, n1 = 0, n2 = 0, n3 = 0, n4 = 0, n5 = 0, n6 = 0, n7 = 0;
printf("Entrer un nombre entier : ");
scanf("%d",&nombreEnt);
printf("Conversion en cours ...");
// Conversion en 1 octet impose une limite
if (nombreEnt <= 256 && nombreEnt >= 0)
{
while(nombreEnt != nombre_essay)
{
i++;
nombre_essay = (n7*2^7)+(n6*2^6)+(n5*2^5)+(n4*2^4)+(n3*2^3)+(n2*2^2)+(n1*2^1)+(n0*2^0);
srand(time(NULL));
if (i>1)
{
n0 = (rand() % (MAX-MIN+1))+MIN;
n1 = (rand() % (MAX-MIN+1))+MIN;
n2 = (rand() % (MAX-MIN+1))+MIN;
n3 = (rand() % (MAX-MIN+1))+MIN;
n4 = (rand() % (MAX-MIN+1))+MIN;
n5 = (rand() % (MAX-MIN+1))+MIN;
n6 = (rand() % (MAX-MIN+1))+MIN;
n7 = (rand() % (MAX-MIN+1))+MIN;
}
}
printf("\nLa conversion de %d binaire est: %d%d%d%d%d%d%d%d\n", nombre_essay, n0, n1, n2, n3, n4, n5, n6, n7);
return 0;
}
else
{
printf("Vous n'avez pas entrer un nombre valide");
return 1;
}
}
(n >> 1) décalera n de 1 bit vers la droite. (En gros, on supprime un bit. Par contre, je ne sais pas si la norme précise que le bit mis à gauche est obligatoirement à 0)
Citation : norme
The result of E1 >> E2 is E1 right-shifted E2 bit positions. If E1 has an unsigned type
or if E1 has a signed type and a nonnegative value, the value of the result is the integral
part of the quotient of E1 / 2E2 . If E1 has a signed type and a negative value, the
resulting value is implementation-defined.
Donc pas de problèmes avec un entier positif, sauf erreur.
Là on ne se pose pas de question, c'est toujours un "décalage logique".
Par contre, si l'opérande gauche est signée et à une valeur négative, le résultat dépend de la plateforme.
Je trouve dommage d'afficher les zéros inutiles à gauche.
Ça permet de bien se rendre compte de l'état de la variable en mémoire je trouve.
Citation
le coup du nMask = 1 suivi de & nMask
c'est plus de l'obfuscation.
Euh, je ne trouve pas, car on a le nMask <<= 1 dans la boucle.
En gros, au lieu de parcourir tous les bytes avec var >> 1 comme je le proposais, on prends un bit de masquage, qu'on applique à chaque bit de la variable.
Je vais tester une solution récursive pour le fun .
le coup du nMask = 1 suivi de & nMask
c'est plus de l'obfuscation.
nMask change de valeur, sinon je n'aurais pas créé une variable.
Une solution récursive utilisera plus de mémoire et sera moins rapide, et le posteur original précise bien "avec une boucle".
Pour le coup des zéros à gauche, moi je préfère, je trouve ça plus simple pour visualiser le nombre total de bits (cf la calculette de windows qui supprime les 0 à gauche, c'est plus souvent une source de problèmes que d'aide).
Tu m'expliques le cast ici : printf("Résultat: %d en binaire = %s\n",(int)nValDec,pStrBin);
Pourquoi utiliser un unsigned dans ce cas là ? entre un nombre supérieur à 2^31 et tu vas avoir des surprises.
Bon, comme je l'ai dit, j'ai écrit le truc en quelque chose comme 5/10 minutes, en pensant aider.
Le cast, je l'ai mis sans trop réfléchir, juste pour ne pas avoir un warning à la compilation. D'habitude je m'en moque un peu, les printf ne me servent en général qu'à débugger.
Il n'y a qu'à caster en (unsigned), et voilà tout. Est-ce vraiment un problème ?
nMask change de valeur, sinon je n'aurais pas créé une variable.
Ah, désolé pour nMask, bien sur ce n'est pas une constante.
Citation : joe78
Pour le coup des zéros à gauche, moi je préfère, je trouve ça plus simple pour visualiser le nombre total de bits (cf la calculette de windows qui supprime les 0 à gauche, c'est plus souvent une source de problèmes que d'aide).
Salut, je suis un élève en cpge.
J'ai essayé et voilà ce que j'ai trouvé. J'ai exécuté et ça a marché:
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int fin, nombreDec, reste, poids;
poids=128;//Le poids est arbitraire on peut choisir n'importe quelle puissance de 2, ça reste un choix
printf("Entrer un nombre decimal:");
scanf("%d",&nombreDec);
printf("La conversion de %d en binaire est:\n\n",nombreDec);
do
{
{
if ((nombreDec-poids) >= 0)
{
reste=1;//Ce poids existe dans le nombreDec il est représenté par 1 en binaire
nombreDec=nombreDec-poids;
}
else
reste =0;//Ce poids n'existe pas donc 0
}
printf("%d",reste);
poids= poids / 2;
}
while(poids>=1);
scanf("%d",&nombreDec);//Juste pour que la fenêtre ne se ferme pas j'ai oublié ce qu'on met normalement
return 0;
}
Tiens d'ailleurs hier soir je intéressais à cela, voila ce que ça donne:
#include<stdio.h>
int main(void)
{
unsigned int n;
unsigned long long I=0x100000000;
printf("Entrer n:");
scanf("%d",&n);
unsigned int i = 0;
for(;(n&I)?0:1;i++,I/=2);
for(;i < (sizeof(n)*8);i++,I/=2)
printf("%d",(n&I)?1:0);
printf("\n");
getchar();
getchar();
}
🍊 - Étudiant - Codeur en C | Zeste de Savoir apprenez avec une communauté | Articles- ♡ Copying is an act of love.
Avant de poster un message, vérifiez la date du sujet dans lequel vous comptiez intervenir.
Si le dernier message sur le sujet date de plus de deux mois, mieux vaut ne pas répondre. En effet, le déterrage d'un sujet nuit au bon fonctionnement du forum, et l'informatique pouvant grandement changer en quelques mois il n'est donc que rarement pertinent de déterrer un vieux sujet.
Au lieu de déterrer un sujet il est préférable :
soit de contacter directement le membre voulu par messagerie privée en cliquant sur son pseudonyme pour accéder à sa page profil, puis sur le lien "Ecrire un message"
soit de créer un nouveau sujet décrivant votre propre contexte
ne pas répondre à un déterrage et le signaler à la modération
Je ferme ce sujet. En cas de désaccord, me contacter par MP.
🍊 - Étudiant - Codeur en C | Zeste de Savoir apprenez avec une communauté | Articles - ♡ Copying is an act of love.