Most programmers I know experience a moment in early in their code writing careers where they are shocked by a profound moment of discovery & realisation about their craft. I’d like to think that this moment helps to crystallise their love of writing line after line of instructions designed to manipulate a pile of silicon and electrons into doing their bidding.

For a large number of those that attended some form of computer science class, or coding school, it was probably when you first saw a recursive function in action:

“WHAT? That function can’t keep calling itself… can it?? Wait…”

I said the same thing above that probably 99% of Programming 101 students said when they saw such a mind twisting piece of code. But no, for me, my major discovery about the beauty and subtlety of the art of programming that lurked a layer beneath the monospaced text on my screen happened way before that.

You see, I was a self taught programmer, and cut my teeth on the very early versions of Turbo Pascal back in the 80’s. I was lucky enough to score a job with a local IBM dealership as a support technician, and also managed to do some small bits of coding on the side for their clients.

One day, a senior IBM System/360 programmer in the company casually asked me: “Devan, do you know how to swap two variables around in RAM?”.

“Sure!” I replied, brimming with 18 year old confidence, “You just create a third variable to hold one of the values temporarily, then you do a reassignment and copy the temporary back into one of the original two…”.

I had fallen into his trap. The same trap that most junior programmers make:

The ‘old fashioned’ way of swapping two variables, using a third.

I remember him shaking his head sagely. “Nope - did you know that you can do it without using a third variable?? We often have to swap over entire blocks of memory on the S/360, and often, we don’t have any extra memory to spare to hold a temporary value.”

I frowned in consternation. This was impossible, wasn’t it? You couldn’t ever swap two variables without using a third placeholder. The first assignment would corrupt one of the values immediately, or so I thought. I asked him if it took longer, or used more steps than the simple answer above. “Nope” he replied again. “It takes the same number of steps, and on some systems, like the S/360, it is actually faster than your example”.

I pondered this problem for most of the day, but in the end had to admit defeat to him. Surely this was just another hazing of a junior employee that he was dishing out here?

Wordlessly, he write the solution down on a whiteboard in the conference room:

Using XOR to swap values in memory.

I stared at what he had written with the same utter confusion that I did much later when looking at my first recursive function. Surely this was impossible. There must be a mistake here. This shouldn’t work. This can’t work.

But it does. Try it.

For those that are curious about the ‘exclusive or’ or XOR function, here is an explanation about it. And our veteran was right, on some CPUs, the XOR operation actually takes less cycles than a PUSH or MOV operation.