Skip navigation

Coma hanno insegnato anche a me, per scambiare il contenuto di due variabili ne serve una d’appoggio, dove copiare temporaneamente il contenuto di una delle due:

int temp, a=15, b=8;

a=temp;       //copio ‘a’ nella variabile di “appoggio”

a=b;             //assegno il contenuto di ‘a’ in ‘b’

b=temp;     //e assegno il valore temporaneamente assegnato a ‘temp’ a ‘b’.

Tre semplici passaggi più l’inizializzazione della variabile temporanea.

Ma possibile che questa operazione così semplice debba essere svolta per forza in questo modo?

Purtroppo per come è strutturato questo linguaggio questa non è così semplice ma c’è una soluzione, lavorare sui bit con un’opportuno operatore: lo XOR, che in pratica (secondo la tabella di verità) restituisce 1 se i due bit sono diversi e 0 se sono uguali. Nel nostro caso per ogni bit della variabile.

L’operazione di scambio risulterebbe quindi così:

Partendo da

A=15   in binario: 1111        e

B=9     in binario: 1001      si ha:

A=A^B                   0110      confrontando bit a bit tutti i valori delle due variabili in binario

sapendo che B=   1001     e quindi confronto 0110 e 1001

B=B^A                   1111       che è giusto giusto 15

A=A^B                   1001      che se controllate è 9: il valore iniziale di B

il codice ovviamente sarebbe più corretto e comodo scritto in una funzione e tengo a precisare che so di non aver scoperto niente di particolare, solo una curiosità già nota.

Annunci

29 Comments

  1. Bel metodo, non sapevo che questa sequenza di operazioni xor avesse questa possibilità.
    Sarebbe interessante fare delle valutazioni di prestazioni, cioè se è più performante eseguire le operazioni di swap con variabile di appoggio o tramite le operazioni di xor … ovviamente qua corriamo sul microsecondo 😀

  2. Ok la curiosità mi ha fatto testare in 4 e 4 otto la velocità di esecuzione di SWAP;
    con un breve programma in c++ e utilizzando le funzioni clock e difftime della libreria cmath
    ho creato due programmi identici eccetto per le 3 istruzioni necessarie allo swap.

    la mia ipotesi era che il confronto XOR necessita più tempo al processore per essere eseguito rispetto ad una assegnazione di valori a variabili.

    difatti risulta che lo swap “tradizionale” impiega la metà del tempo (anche di meno) ad essere eseguito rispetto allo swap XOR-mediato, il tutto al modico costo di spazio in ram riservato per effettuare lo scambio…

    • certo! questo metodo (xor) richiede al processore un numero maggiore di calcoli, non è molto conveniente in effetti, se poi mi dici che non si risparmia neanche in spazio sulla ram, attuato come è stato attuato in questo semplice programma non ha senso se non risparmiare al programmatore la dichiarazione di una variabile. Ora come ora non riesco a immaginare quale possibile impiego vantaggioso possa avere questo metodo per lo swap. Probabilmente nessuno. Insomma in linea con gli altri post anche questo risulta uno dei tanti post inutili annidati nella rete =)

      • comunque grazie mille per aver posto il quesito (ed esserti pure auto-risposto! 😀 )

  3. There is definately a great deal to find out about this topic.
    I like all the points you have made.

  4. A+=b
    B=a
    A-=b

  5. Potrebbe avere senso fare lo swap usando solo 2 variabili qualora questo fosse più veloce dello swap usando 3 variabili. con A+=b hai cmq il problema che se A e B sono troppo grandi farai un integer overflow (anche se fosse più veloce non sarebbe “safe” da eseguire). I Compilatori C++ sono estremamente raffinati, e scelgono sempre la via più veloce (e safe) per fare swap (il metodo più efficace consiste nell’usare boost::swap(T &a, T&b). Un possibile utilizzo è quando bisogna fare lo swap di array molto lunghi, in tal caso le latenze della RAM o della cache (specialmente se l’array non viene seguito in maniera sequenziale) potrebbero preferire metodi alternativi. In caso contrario lo swap usando la 3° variabile è sempre il metodo preferito (se i processori supportano l’istruzione swap a livello assembly, il compilatore C++ ottimisticamente userà quella invece di lavorare su 3 registri risparmiando in questo modo un registro).

  6. I honestly value all of the tough effort you’ve done keeping this blog here for all of us. I seriously hope this is around for a really long time.

  7. It is the best time to make some plans for the long run and it’s time to be happy. I’ve
    read this post and if I may just I want to suggest
    you few attention-grabbing things or tips. Maybe you
    can write subsequent articles regarding this article.
    I want to read even more things about it!

  8. Remarkable! Its genuinely amazing article, I have got
    much clear idea concerning from this post.

  9. Thank you for the good writeup. It in fact was a amusement account it.

    Look advanced to far added agreeable from you! However, how can we communicate?

  10. Just want to say your article is as amazing.
    The clearness in your post is just nice and i could assume you’re an expert on this subject. Well with your permission let me to grab your feed to keep updated with forthcoming post. Thanks a million and please carry on the enjoyable work. visual impact muscle building

  11. This excellent website certainly has all of the info I wanted concerning this subject and didn’t know who to ask.

  12. naturally like your web site but you have to check the spelling on several of your posts.
    Several of them are rife with spelling problems and
    I find it very troublesome to inform the reality then again I will certainly come
    back again. cellulite treatment

  13. Greetings! This is my first visit to your blog! We are a group of volunteers and
    starting a new project in a community in the same niche.
    Your blog provided us valuable information to
    work on. You have done a marvellous job! dating sim

  14. I am curious to find out what blog platform you happen to be working with?
    I’m having some small security issues with my latest site and I would like to find something more secure. Do you have any solutions?

  15. When I originally commented I clicked the “Notify me when new comments are added” checkbox and now each
    time a comment is added I get four emails with the same comment.
    Is there any way you can remove people from that service?
    Bless you!

  16. I personally want to take note of this article, “[C\C++] Scambiare
    i valori di due variabili senza appoggio Il katta’s Blog” on my website. Do you mind in the event that I actuallydo it? Many thanks ,Gabriela

  17. I blog often and I really appreciate your content.
    The article has truly peaked my interest. I’m going to bookmark your site and keep checking for new details about once a week. I subscribed to your Feed as well.

  18. Truly when someone doesn’t understand afterward its up to other viewers that they will help, so here it happens.

  19. Pretty nice post. I just stumbled upon your blog and wanted to say that I have
    truly enjoyed surfing around your blog posts. In any case I will be subscribing to your feed
    and I hope you write again very soon!

  20. Hello my family member! I wish to say that this
    article is awesome, great written and come with approximately all vital infos.
    I’d like to peer extra posts like this .

  21. This design is wicked! You definitely know how to keep a reader amused.
    Between your wit and your videos, I was almost moved to start my own blog
    (well, almost…HaHa!) Fantastic job. I really loved what you had to say, and more than that, how you presented it.
    Too cool! Thanks a lot!

  22. Do you have a spam problem on this website; I also am
    a blogger, and I was wanting to know your situation; many of us have developed some nice practices and we are looking to exchange strategies with other folks, please shoot me an email if interested.
    Very much appreciated information!

  23. I often do not publish in Blogs but your blog pushed me to,
    amazing job. wonderful. It’s been so very much appreciated!

  24. The other day, while I was at work, my sister stole my
    apple ipad and tested to see if it can survive a twenty five foot drop, just so she can be a youtube sensation.
    My iPad is now destroyed and she has 83 views. I
    know this is completely off topic but I had to share it with someone!
    Many thanks!

  25. Incredible points. Outstanding arguments. Keep up the amazing spirit.

  26. Una piccola svista 🙂

    int temp, a=15, b=8;
    temp=a; // Copio ‘a’ nella variabile di “appoggio”
    a=b; // Assegno il contenuto di ‘a’ in ‘b’
    b=temp; // Assegno il valore temporaneamente assegnato a ‘temp’ a ‘b’.

  27. Heya i am for the firѕt time herе. I found this board ɑnd I find Ӏt really useful & it hᥱⅼped me oսt mսch.

    I Һope to give something back and help otɦers like you helped me.


Rispondi

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...

%d blogger hanno fatto clic su Mi Piace per questo: