Partage
  • Partager sur Facebook
  • Partager sur Twitter

Inversion des nombre en binaire.

Sujet résolu
15 octobre 2019 à 22:34:41

Bonjour, 

Je dois créer des programmes pour une soutenance en novembre. Je bloque sur un bout d'un programme.J'ai fait un algo qui me donne avec un caractère tapé en binaire sur la table ascii sans fonction. J'ai un problème après il y a un autre bout qui fonctionne mais prend le bit de point faible alors qu'il devrait prendre le bit de point fort. 

Y aurait il une technique pour inverser un nombre en binaire. 

Exemple    1000011   donne 1100001 

Quelqu'un peut me m'aider a trouver sachant L'utilisation de tableaux et/ou de fonctions est interdite dans ce PROJET. 

Une idées m'aiderait beaucoup.

  • Partager sur Facebook
  • Partager sur Twitter
16 octobre 2019 à 0:01:34

Hello,

Un de ces algorithmes peut-être ?

-
Edité par edgarjacobs 16 octobre 2019 à 0:05:14

  • Partager sur Facebook
  • Partager sur Twitter

On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

16 octobre 2019 à 5:07:42

Salut
Je ne sais pas si ari123 a essayé une de ses techniques. Moi, j'ai essayé la suivante:
Reverse the bits in a byte with 3 operations (64-bit multiply and modulus division):
Celle-ci semble fonctionner.
  • Partager sur Facebook
  • Partager sur Twitter

Le Tout est souvent plus grand que la somme de ses parties.

16 octobre 2019 à 10:35:00

Sous quel forme est ton nombre, entier (int, long...) ou chaîne de caractères ?

-
Edité par rouloude 16 octobre 2019 à 10:35:10

  • Partager sur Facebook
  • Partager sur Twitter
16 octobre 2019 à 10:42:56

Une chaîne de caractères est un tableau et il n'en a pas le droit.
  • Partager sur Facebook
  • Partager sur Twitter

Bonhomme !! | Jeu de plateforme : Prototype.

16 octobre 2019 à 14:05:46

Il est sous int 
int main(int argc,char**argv){
    char alphabet;
    int letter;
    int binarie=0;
    int square0=0;
    int square1=0;
    int square2=0;
    int square3=0;
    int square4=0;
    int square5=0;
    int square6=0;
    int number=1000000;
    int i=0;
    int null=0;
    int one=0;
    printf("Tapez un caractere:\n");
    scanf("%c",&alphabet);
    printf("%d\n",alphabet);
    letter=alphabet;
    while(letter!=0){
        if (letter>=64){
            letter=letter-64;
            binarie=binarie+1000000;
            square6=1;
        }else if(letter>=32){
            letter=letter-32;
            binarie=binarie+100000;
            square5=1;
        }else if(letter>=16){
            letter=letter-16;
            binarie=binarie+10000;
            square4=1;
        }else if(letter>=8){
            letter=letter-8;
            binarie=binarie+1000;
            square3=1;
        }else if(letter>=4){
            letter=letter-4;
            binarie=binarie+100;
            square2=1;
        }else if(letter>=2){
            letter=letter-2;
            binarie=binarie+10;
            square1=1;
        }else if(letter>=1){
            letter=letter-1;
            binarie=binarie+1;
            square0=1;
            }
}
 printf("%d\n",binarie);
 printf("%d%d%d%d%d%d%d\n",square6,square5,square4,square3,square2,square1,square0);
 return 0;
 }

Tenez le code que j'ai fait.

J'ai fait de deux façon le résultat. Le résultat dans une variable et l'autre chaque bit dans une variable.

-
Edité par ari123 16 octobre 2019 à 14:08:22

  • Partager sur Facebook
  • Partager sur Twitter
16 octobre 2019 à 14:20:55

J'avais pensé aux `shift' tels que `n<<s' ou `n>>s' avec les masques appropriés.
Mais je me suis dit que ce serait trop long.
  • Partager sur Facebook
  • Partager sur Twitter

Le Tout est souvent plus grand que la somme de ses parties.

16 octobre 2019 à 15:50:43

Tu peux faire une union et inverser une chaine de caractère, ce qui est beaucoup plus simple que de toucher au binaire dans ce cas

-
Edité par DarkJambon 16 octobre 2019 à 15:51:00

  • Partager sur Facebook
  • Partager sur Twitter
16 octobre 2019 à 16:06:12

J'ai trouver c'était très con 

int main(int argc,char**argv){
    char alphabet;
    int letter;
    int rest;
    int binary=0;
    int digit=0;
    int bit=0;
    printf("Tapez un caractere:\n");
    scanf("%c",&alphabet);
    printf("%d\n",alphabet);
    letter=alphabet;
    while(letter!=0){
        if (letter>=64){
            letter=letter-64;
            binary=binary+1;
        }else if(letter>=32){
            letter=letter-32;
            binary=binary+10;
        }else if(letter>=16){
            letter=letter-16;
            binary=binary+100;
        }else if(letter>=8){
            letter=letter-8;
            binary=binary+1000;
        }else if(letter>=4){
            letter=letter-4;
            binary=binary+10000;
        }else if(letter>=2){
            letter=letter-2;
            binary=binary+100000;
        }else if(letter>=1){
            letter=letter-1;
            binary=binary+1000000;
            }
}
 printf("%d\n",binary);

Voila j'ai juste changer les binary=binary+1;

                                       binary=binary+10;

C'était tout con

   

  • Partager sur Facebook
  • Partager sur Twitter
16 octobre 2019 à 16:50:54

Salut,

En fait, c'est tellement tout con que tu as probablement trouvé la méthode la plus compliquée et non-automatisée au possible. Tu t'y prendrais comment avec un binaire de 64 bits ?

  • Partager sur Facebook
  • Partager sur Twitter

Bonhomme !! | Jeu de plateforme : Prototype.

16 octobre 2019 à 17:18:53

DarkJambon a écrit:
Tu peux faire une union et inverser une chaine de caractère, ce qui est beaucoup plus simple que de toucher au binaire dans ce cas
Parles-tu de quelque chose du genre: ?
unsigned char byte[8]:1;
Pour 64 bits, pourrais-je écrire: ?
unsigned char word[64]:1;
  • Partager sur Facebook
  • Partager sur Twitter

Le Tout est souvent plus grand que la somme de ses parties.

16 octobre 2019 à 17:26:40

int main(void)
{
    char letter;

      scanf("%c", &letter);

    int produit	= 1,
        revBin 	= 0;

        for(int i = CHAR_BIT-1; i>=0; i--)
        {
            revBin += (letter & (1<<i))? produit : 0;
            produit *= 10;
        }

        printf("%d\n", revBin);

        return 0;
}

Si tu as 16 bits tu changes "CHAR_BIT-1" par 15, par 31 si tu as 32 bits etc... Changer le type des variables de stockage pour qu'elles soient assez grandes.

Mais globalement c'est un peu plus automatisé que de se taper 3 lignes par bit.

Bonne continuation.

-
Edité par drx 16 octobre 2019 à 17:27:22

  • Partager sur Facebook
  • Partager sur Twitter

Bonhomme !! | Jeu de plateforme : Prototype.

16 octobre 2019 à 17:44:40

#include <stdio.h>

int miroir(int donnee) {
	int resultat = 0;
	while (donnee != 0) {
		resultat = (resultat << 1) | (donnee & 1);
		donnee >>= 1;
	}
	return resultat;
}

void verifier(int donnee, int attendu) {
	int resultat = miroir(donnee);
	printf("%d\t=> %d\t%s %d\n",
		donnee, resultat, 
		resultat == attendu ? "==" : "!=", 
		attendu);
}

int main(int argc, char **argv)
{	
	verifier(0, 0);
	verifier(1, 1);
	verifier(0b10011,     0b11001);
	verifier(0b110100111, 0b111001011);
	return 0;
}
Avertissement : Avoir une solution, c'est bien, mais montrer à un jury qu'on comprend ce qui est écrit, qu'on est capable d'expliquer pourquoi on fait comme ça, et de faire en live un exercice du même genre, c'est une autre affaire.
  • Partager sur Facebook
  • Partager sur Twitter
16 octobre 2019 à 17:53:03

Re,-

J'ai testé le premier code de mon lien (Reverse bits the obvious way), cela fonctionne

#include <stdio.h>
#include <limits.h>
#include <stdlib.h>

unsigned reverse(unsigned int v) {
	unsigned int r = v;					// r will be reversed bits of v; first get LSB of v
	int s = sizeof(v) * CHAR_BIT - 1;	// extra shift needed at end
	
	for (v >>= 1; v; v >>= 1) {   
		r <<= 1;
		r |= v & 1;
		s--;
	}
	r <<= s;							// shift when v's highest bits are zero
	
	return(r);
}

int main(int argc,char *argv[]) {
	if(argc>1)
		printf("rev %s = %u\n",argv[1],reverse(atoi(argv[1])));
	
	return(0);
}
  • Partager sur Facebook
  • Partager sur Twitter

On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

16 octobre 2019 à 17:58:52

Ca dépend. Est que l'inverse    de 1011 est 1101, ou 110100...0 ?

  • Partager sur Facebook
  • Partager sur Twitter
16 octobre 2019 à 18:02:25

Comme c'est effectué sur sizeof(v), seconde proposition. À voir ce que veux le PO ....

-
Edité par edgarjacobs 16 octobre 2019 à 18:24:37

  • Partager sur Facebook
  • Partager sur Twitter

On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

16 octobre 2019 à 19:26:14

C'est vrai que mon code n'est pas optimisée mais il ne dépassera pas 128 comme nombre. Mais j'ai une consigne en plus pour cette exercice en particulier .Remarques :  • l'utilisation d'opérateurs de manipulation binaire est interdite, • Remarques :  •• le résultat doit être affiché en binaire et en décimal. 

Sinon merci pour toute votre aide. POur ceux qui pense qu'on peut faire mieux je rappelle pas le droit tableau et fonction et opérateur de manipulation binaire 

-
Edité par ari123 16 octobre 2019 à 19:33:55

  • Partager sur Facebook
  • Partager sur Twitter
16 octobre 2019 à 19:48:18

ari123 a écrit:

Sinon merci pour toute votre aide. POur ceux qui pense qu'on peut faire mieux je rappelle pas le droit tableau et fonction et opérateur de manipulation binaire 


Pour les opérateurs binaires, fallait le dire plus tôt. Mais quelle connerie ! C'est comme si je demandais à quelqu'un de percer un trou dans un mur, en lui disant: "'t'as pas droit à la perceuse à percussion, mais voilà une chignole" !

-
Edité par edgarjacobs 16 octobre 2019 à 20:08:27

  • Partager sur Facebook
  • Partager sur Twitter

On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

16 octobre 2019 à 22:12:48

Surtout que pour les décalages on fait des multiplications divisions par 2, et le reste de la division pour avoir le bit de droite. Contrainte sans intérêt.
  • Partager sur Facebook
  • Partager sur Twitter
17 octobre 2019 à 1:07:13

Salut,
Il aurait fallu savoir pourquoi le prof (?) a imposé ces contraintes.
Voulait-il justement que la personne se débrouille avec les opérateurs * / % seulement?
En passant, une bonne façon de vérifier si ça marche est d'inverser deux fois.
Si ça donne toujours la valeur originale, c'est que ça fonctionne.
  • Partager sur Facebook
  • Partager sur Twitter

Le Tout est souvent plus grand que la somme de ses parties.

17 octobre 2019 à 7:12:49

Il y a d'autres opérations involutives.  La complémentation  (~) par exemple. Ou l'opposé,  Ou....

-
Edité par michelbillaud 17 octobre 2019 à 7:14:25

  • Partager sur Facebook
  • Partager sur Twitter
17 octobre 2019 à 10:50:48

@ari123 : Ça serait mieux de donner l’énoncé exact, que de nous faire deviner ce que l'on peu faire ou pas faire !
  • Partager sur Facebook
  • Partager sur Twitter
17 octobre 2019 à 14:02:32

J'ai réussi. Mon programme marche tout le temps tenez l'énoncé

objectif de cet exercice est de codifier des caractères en une base texte, appelé "z-aire", c'est-à-dire en utilisant uniquement des symboles z. Le principe de ce codage est le suivant : • le programme travaille sur un caractère en entrée et construit en sortie une suite de blocs de symboles z, séparés par des espaces, • deux blocs consécutifs servent à coder une série de bits de même valeur (une suite de 1 ou une suite de 0) : o premier bloc : il vaut z si la série contient des 1 ou zz si elle contient des 0, o deuxième bloc : le nombre de z dans ce bloc correspond au nombre de bits dans la série 

Exemple  • C en binaire vaut 1000011, la traduction en unaire est donc z z zz zzzz z zz o z z (la première série composée d'un seul 1) o zz zzzz (la deuxième série composée de quatre 0) o z zz (la troisième série composée de deux 1) • z vaut 1111010, la traduction en unaire est donc z zzzz zz z z z zz z 

Construire un programme C permettant de saisir un caractère quelconque et d'en donner sa traduction en z-aire. Le résultat devra être affiché en binaire, en décimal et sous la forme d’un caractère. 

l'utilisation d'opérateurs de manipulation binaire est interdite, • le résultat doit être affiché en binaire et en décimal.   

L'utilisation de tableaux et/ou de fonctions est interdite dans ce PROJET. 

  • Partager sur Facebook
  • Partager sur Twitter
18 octobre 2019 à 12:02:17

PierrotLeFou a écrit:

DarkJambon a écrit:
Tu peux faire une union et inverser une chaine de caractère, ce qui est beaucoup plus simple que de toucher au binaire dans ce cas
Parles-tu de quelque chose du genre: ?
unsigned char byte[8]:1;
Pour 64 bits, pourrais-je écrire: ?
unsigned char word[64]:1;


Quand je parlais d'union c'était ça

union type
{
    int entier;
    char str[8]
};

Et tu peux remplacer le int par un long ou un double et adapter la taille du str

gg pour le projet sinon

  • Partager sur Facebook
  • Partager sur Twitter