IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Alterner deux variables entières


Sujet :

C

  1. #1
    Nouveau candidat au Club
    Homme Profil pro
    Collégien
    Inscrit en
    Décembre 2023
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Collégien

    Informations forums :
    Inscription : Décembre 2023
    Messages : 1
    Par défaut Alterner deux variables entières
    Je voudrais alterner les valeurs de 2 variables entières sans utiliser une autre variable auxiliaire.Comment faire ?

  2. #2
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 967
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 967
    Par défaut
    Bonjour,

    Ce n'est pas difficile, mais avant :

    es-tu vraiment à cours de mémoire pour avoir besoin de faire ça ?

  3. #3
    CGi
    CGi est déconnecté
    Expert confirmé
    Avatar de CGi
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    1 061
    Détails du profil
    Informations personnelles :
    Localisation : France, Allier (Auvergne)

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 061
    Par défaut
    Tu veux dire échanger ? Car dans alterner, il y a une notion de répétition et le il te faudra un timer.
    Site : http://chgi.developpez.com

    Pourquoi faire simple quand on peut faire compliqué ? (Jacques Rouxel)

  4. #4
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 832
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 832
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    int a=123;
    int b=456;
    a=a^b;
    b=a^b;
    a=a^b;
    printf("a=%d, b=%d\n", a, b) // a=456, b=123
    Mais déjà ça a autant d'affectations que de passer par une 3° variable intermédiaire de tampon et ça a 3 opérations en plus ; et si tu as au départ a == b ça ne marche plus.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par défaut
    Je connaissais la version avec ^, ici ils généralisent.
    Il y a certainement des intrinsics pour le faire. Ce serait le plus efficace.
    Utiliser une lib standard serait mieux. std::swap est disponible en C++, il ne semble rien y avoir en C.
    La question initiale reste au mieux vague de toute façon.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  6. #6
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 832
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 832
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Bousk Voir le message
    Je connaissais la version avec ^
    Ah pardon pardon, je me suis trompé (la fatigue). J'ai rectifié

    Citation Envoyé par Bousk Voir le message
    Mouais suis pas certain que ça surmonte les soucis de bit signé et de dépassement
    Mais là suis fatigué de réfléchir (journée bien chargée) alors tant pis, je laisse à un autre la suite
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  7. #7
    Membre Expert

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2013
    Messages
    1 628
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2013
    Messages : 1 628
    Par défaut
    Bonjour SVE,

    Citation Envoyé par Sve@r Voir le message
    ...et si tu as au départ a == b ça ne marche plus.
    Je présume que c'était vrai avant le passage en ^ mais la permutation est bien valable, quoique inutile, pour a == b parce que ^ est associative et commutative.

    Salut

  8. #8
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 832
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 832
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Guesset Voir le message
    mais la permutation est bien valable, quoique inutile, pour a == b parce que ^ est associative et commutative.
    Inutile certes... mais pas valable. L'associativité et la commutativité n'ont rien à voir. Déjà l'associativité ne s'applique que s'il y a plus de 2 opérandes (l'associativité de l'addition c'est dire que a+b+c aura le même résultat quelle que soit l'addition intermédiaire qui sera faite pour additionner le montant intermédiaire au 3° nombre restant).
    Et la commutativité (qui dit que permuter les opérandes ne change pas le résultat) est tout aussi inutile dans le cas où a == b. Car si a == b, dès la première opération a=a^b on obtient a=0. Ayant perdu a, on ne peut alors plus le retrouver dans b au final.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  9. #9
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 599
    Par défaut
    Si a et b ont la même valeur, ça ne pose pas de problème particulier.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    unsigned int a = 2, b= 2;
    a = a ^ b;  // a=0
    b = a ^ b;  // b=2
    a = a ^ b;  // a=2, a et b ont bien été échangées
     
    a = a + b;  // a=4
    b = a - b;  // b=2
    a = a - b;  // a=2, a et b ont bien été échangées
     
    a = a * b;  // a=4
    b = a / b;  // b=2
    a = a / b;  // a=2, a et b ont bien été échangées
    Pour la multiplication, ça ne marchera pas s'il y dépassement de capacité ou si a ou b est nul.
    Pour l'addition, aucun problème pour les unsigned, mais problème pour les signed car le dépassement est un U.B.

    Mais si a et b sont la même variable, ça ne marche pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    unsigned int *pa = &a, *pb= &a;
    *pa = *pa ^ *pb;  // *pa=0, mais aussi *pb = 0 !!
    *pb = *pa ^ *pb;  // *pb=0 *pa=0
    *pa = *pa ^ *pb;  // *pa=0 *pb=0, a et b ont bien été perdus!
     
    *pa = *pa + *pb;  // *pa=4, mais aussi *pb = 4!
    *pb = *pa - *pb;  // *pb=0 *pa=0
    *pa = *pa - *pb;  // *pa=2 *pb=0, a et b ont bien été perdus!

  10. #10
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 832
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 832
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par dalfab Voir le message
    Mais si a et b sont la même variable, ça ne marche pas
    Ah pardon oui c'est ça. Ce n'est pas la même valeur qui pose souci mais si c'est utiliser ce calcul pour permuter deux pointeurs pointant vers la même variable.
    Désolé de l'erreur
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  11. #11
    Membre Expert

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2013
    Messages
    1 628
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2013
    Messages : 1 628
    Par défaut
    Bonjour Sve,

    Citation Envoyé par Sve@r Voir le message
    Inutile certes... mais pas valable. L'associativité et la commutativité n'ont rien à voir. Déjà l'associativité ne s'applique que s'il y a plus de 2 opérandes (l'associativité de l'addition c'est dire que a+b+c aura le même résultat quelle que soit l'addition intermédiaire qui sera faite pour additionner le montant intermédiaire au 3° nombre restant).
    Et la commutativité (qui dit que permuter les opérandes ne change pas le résultat) est tout aussi inutile dans le cas où a == b. Car si a == b, dès la première opération a=a^b on obtient a=0. Ayant perdu a, on ne peut alors plus le retrouver dans b au final.
    Tu te trompes. Démonstration de principe, si tu avais raison ce serait également vrai bit par bit (c'est une opération binaire qui n'altère que les bits de même rang) donc cela ne fonctionnerait pas pour tous les bits identiques (de même rang bien sûr) donc pour toutes les valeurs qui auraient la malchance de partager ne serait-ce qu'un bit et pas seulement pour celles qui sont identiques c'est à dire dont tous les bits sont les mêmes. Cela ne laisserait pas beaucoup de cas où le mécanisme fonctionnerait : seulement si b = ~a.

    Outre cette démonstration partielle par l'absurde, l'application de l'associativité et commutativté de l'opérateur ^ donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    a = a_o ;  // a_o valeur d'origine, seulement utile pour suivre la séquence
    b = b_o ;  // b_o valeur d'origine
    a = a ^ b; // a = a_o ^ b_o
    b = a ^ b; // b = (a_o ^ b_o) ^ b_o = a_o ^ b_o ^ b_o = a_o ^ (b_o ^b_o) = a_o ^ 0 = a_o (associativité)
    a = a ^ b; // a = (a_o ^ b_o) ^ a_o =  a_o ^ b_o ^ a_o = a_o ^a_o ^ b_o == (a_o ^a_o) ^ b_o  = 0 ^ b_o = b_o (commutativité puis associativité)
    Aucune hypothèse sur les valeurs de a et b. Je pense que ce qui peut gêner est l'apparition de 0, mais pour le ^ ce n'est pas un élément absorbant (comme pour le &) mais un élément neutre.

    Appliquons ce qui précède si a == b :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    a = u ;  // u valeur d'origine, utile pour suivre la séquence
    b = u ;  // u valeur d'origine
    a = a ^ b; // a = u ^ u = 0
    b = a ^ b; // b = 0 ^ u = u
    a = a ^ b; // a = 0 ^ u = u, inutile mais exact
    Salut

  12. #12
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 832
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 832
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Guesset Voir le message
    Tu te trompes.
    Hé oui, comme je l'ai déjà admis dans mon post de 9h49...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  13. #13
    Membre Expert

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2013
    Messages
    1 628
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2013
    Messages : 1 628
    Par défaut
    Rebonjour Sve,

    Citation Envoyé par Sve@r Voir le message
    Ce n'est pas la même valeur qui pose souci mais si c'est utiliser ce calcul pour permuter deux pointeurs pointant vers la même variable...
    Tu vas croire que je t'en veux mais, sauf erreur de ma part, dalfab ne permute pas les pointeurs mais les contenus de deux variables qui s'avèrent en fait n'en être qu'une.

    Salut.

  14. #14
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 832
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 832
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Guesset Voir le message
    dalfab ne permute pas les pointeurs mais les contenus de deux variables qui s'avèrent en fait n'en être qu'une.
    Raccourci dans l'écriture. Bien évidemment que "étoile truc" représente la valeur située à l'adresse stockée dans le pointeur "truc". Je pensais que mon expérience passée sur la partie "C" de ce forum suffirait pour que tu admettes que c'est de cela dont je parle sans venir me forcer à le spécifier explicitement.

    Citation Envoyé par Guesset Voir le message
    Tu vas croire que je t'en veux
    Oui ça commence à me caresser l'esprit.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  15. #15
    Membre Expert

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2013
    Messages
    1 628
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2013
    Messages : 1 628
    Par défaut
    Bonjour Sve,

    Citation Envoyé par Sve@r Voir le message
    Je pensais que mon expérience passée sur la partie "C" de ce forum suffirait pour que tu admettes que c'est de cela dont je parle sans venir me forcer à le spécifier explicitement.
    Oui, j'aurais peut être dû considérer cela. Comme toi ne pas supposer que je parle de commutativité et d'associativité sans raison. Sans rancune.

    Salut

  16. #16
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 832
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 832
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Guesset Voir le message
    Comme toi ne pas supposer que je parle de commutativité et d'associativité sans raison.
    Exact je l'ai mérité. J'aurais vraiment dû tester l'opération avec a==b. Comme je me souvenais qu'il y avait un souci j'aurais vu qu'il ne provenait pas de l'égalité et j'aurais creusé un peu plus dans mes souvenirs.

    Citation Envoyé par Guesset Voir le message
    Sans rancune.
    Ok
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

Discussions similaires

  1. Permuter deux variables sans variable temporaire
    Par khayyam90 dans le forum Algorithmes et structures de données
    Réponses: 7
    Dernier message: 09/01/2015, 08h02
  2. [struts] Comparer deux variables avec <logic:equal>
    Par trax020 dans le forum Struts 1
    Réponses: 4
    Dernier message: 29/05/2005, 11h08
  3. [STRUTS] Tag Equal, comparer deux variables
    Par logica dans le forum Struts 1
    Réponses: 2
    Dernier message: 04/06/2004, 12h01
  4. enregistrer deux variable différente dans un seul champs
    Par developpeur_mehdi dans le forum Bases de données
    Réponses: 7
    Dernier message: 07/03/2004, 23h18
  5. Concaténer deux variables ?
    Par glsn dans le forum ASP
    Réponses: 2
    Dernier message: 19/12/2003, 13h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo