Click here to Skip to main content
Licence CPOL
First Posted 13 Aug 2002
Views 174,957
Bookmarked 38 times

The Stupid XOR Trick

Explaining the phenomenon of x^=y^=x^=y;

Introduction

As a result of many, sometimes insulting, reactions on my signature, I decided to write an article on this topic. The mentioned signature looks like this:

int x=1, y=5; 
x^=y^=x^=y; // what's the content of x and y now?

Well, the reactions range from "that's not even valid C/C++ code" to "that works only with X=1 and y=5" and "you better learn C". To all these unbelievers and of course everyone else who doesn't know this "trick"; may this article enlighten you :)

What it's meant to do

Simply exchange the values of two integer variables without using a temporary variable. It gives unpredictable results with other variable types than integer types.

The symbol ^ is the XOR operator used in C/C++. See the article from PJ Arends on Bitwise Operators for a full introduction to bits and related operators.

The questionable code fragment x^=y^=x^=y; can be expanded into x XOR y XOR x XOR y. Since C/C++ resolves expressions like this from right to left, we can split it into the steps performed by the compiler:

x ^= y; // the right-most expression
y ^= x; // the middle expression
x ^= y; // the left-most expression

Which can be further expanded into

x = x ^ y; // x = 1 XOR 5  -> x = 4
y = y ^ x; // y = 5 XOR 4 = 1  -> y = 1
x = x ^ y; // x = 4 XOR 1 = 5  -> x = 5

Voila, here we are x=5 and y=1. That's what we wanted to achieve. And all this without using a temporary variable like in int t = x; x = y; y = t; which most programmers use. I confess that my method is confusing to most people because it's a little known method. As an additional benefit, the compiler can translate it into 3 simple XOR assembler statements.

Sample

For all who still don't believe it, here is a sample program to prove  that it works (with any integer number). The sample can be compiled in Ansi and Unicode and is compatible with VC6 and VC7. It is not using any library except the standard C Runtime Library.

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

int _tmain(int argc, TCHAR* argv[])
{
    if(argc != 3)
    {
        _tprintf(
            _T("\nUsage: StupidXORTricks.exe intvalue1 intvalue2\n"));
    }
    else
    {
        int x = _ttoi(argv[1]);
        int y = _ttoi(argv[2]);

        _tprintf(_T("x = %d, y = %d\n"), x, y);
        _tprintf(_T("Performing x^=y^=x^=y...\n"));
		
        x^=y^=x^=y;

        _tprintf(_T("x = %d, y = %d\n"), x, y);

    }
    return 0;
}

Finally, I hope that I don't get any more responses to my sig. :)

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

About the Author

Andreas Saurwein Franci Gonçalves

CEO
Uniwares Ltda.
Brazil Brazil

Member



Sign Up to vote   Poor Excellent
Add a reason or comment to your vote: x
Votes of 3 or less require a comment

Comments and Discussions

 
You must Sign In to use this message board. (secure sign-in)
 
Search this forum  
 FAQ
    Noise  Layout  Per page   
  Refresh
GeneralSee this. PinmemberNibu thomas17:27 7 Nov '05  
GeneralRe: See this. Pinmembertoxcct23:42 26 Feb '06  
GeneralRe: See this. PinmemberNibu thomas23:43 26 Feb '06  
GeneralRe: See this. Pinmembertoxcct23:45 26 Feb '06  
GeneralRe: See this. PinmemberNibu thomas23:48 26 Feb '06  
GeneralRe: See this. Pinmembertoxcct23:51 26 Feb '06  
GeneralRe: See this. PinmemberNibu thomas23:52 26 Feb '06  
GeneralRe: See this. Pinmembertoxcct23:54 26 Feb '06  
GeneralRe: See this. PinmemberNibu thomas23:56 26 Feb '06  
GeneralTrick subject to compiler (eek, gcc 3.x) PinsussAnonymous14:18 17 Aug '05  
GeneralA tiny "proof" for the trick, just for fun PinmemberHumpzlopogas17:37 15 Nov '03  
GeneralRe: A tiny "proof" for the trick, just for fun PinmemberSaurweinAndreas4:07 16 Nov '03  
GeneralOld trick PinmemberDimitris Vassiliades22:56 26 Sep '03  
GeneralRe: Old trick PinmemberMr.Prakash16:43 1 Dec '03  
GeneralRe: Old trick PinmemberDimitris Vassiliades18:56 1 Dec '03  
GeneralRe: Old trick PinmemberMr.Prakash21:16 1 Dec '03  
Generalx ^= y ^= x ^= y is undefined. Period. Pinsussstickboy17:57 20 May '03  
GeneralRe: x ^= y ^= x ^= y is undefined. Period. PinmemberSaurweinAndreas4:29 21 May '03  
GeneralRe: x ^= y ^= x ^= y is undefined. Period. Pinsussstickboy17:36 21 May '03  
GeneralRe: x ^= y ^= x ^= y is undefined. Period. PinmemberSaurweinAndreas0:03 22 May '03  
GeneralRe: x ^= y ^= x ^= y is undefined. Period. Pinsussstickboy7:11 22 May '03  
GeneralRe: x ^= y ^= x ^= y is undefined. Period. Pinmember.:fl0yd:.0:23 14 Jun '03  
GeneralRe: x ^= y ^= x ^= y is undefined. Period. PinsussAnonymous21:29 2 Nov '03  
GeneralRe: x ^= y ^= x ^= y is undefined. Period. PinmemberBSCE200622:49 20 Nov '04  
GeneralRe: x ^= y ^= x ^= y is undefined. Period. Pinmemberbitznarf7:35 9 Aug '06  

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

Permalink | Advertise | Privacy | Mobile
Web04 | 2.5.120517.1 | Last Updated 14 Aug 2002
Article Copyright 2002 by Andreas Saurwein Franci Gonçalves
Everything else Copyright © CodeProject, 1999-2012
Terms of Use
Layout: fixed | fluid