Hacker Newsnew | past | comments | ask | show | jobs | submitlogin

You can do the same with addition/subtract. Perhaps there is a simpler way, but here is one way to do it:

    a = a + b
    b = b + a
    a = b - a
    b = b - 2*a


a = a + b

b = a - b

a = a - b

I think this works too, assuming a+b doesn't overflow.


Good one.

> I think this works too, assuming a+b doesn't overflow.

Well, in two's complement arithmetic (as is used on most architectures), the intermediate overflow can be ignored, and it will work just fine.


You have to take overflow into account. In most cases, that would make the algorithm not very useful compared to just doing the swap with a third variable.


In two's complement arithmetic, you are basically computing modulo N (N = 2 to the power of the number of bits). So overflow will not interfere with the swap operation.


Hm I don't think overflow will apply. Anything it does in an add will be undone by a subtract?

Except that 2a, that might be trouble.


Imagine you only had 4 bit numbers (range 0-15) and you tried to do swap 14, 15 (1110, 1111). You can do that with xor but not with the add method, because you can't store a + b without a wider variable.


15 + 15 gives 14

14 - 15 gives 15


The way I wrote this was rubbish, edited. I was trying to get at if you have 1110, 1111 then 1110 + 1111 will overflow, but you could xor them.


  1110 + 1111 = 1101
  1101 - 1110 = 1111
  1101 - 1111 = 1110
Overflow doesn't matter if you just want to swap.


(Assuming two's complement arithmetic, as amelius pointed out - I don't know if all programming languages and platforms use it)


That's a really smart observation I hadn't made, thanks for explaining!




Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: