Блог пользователя sebi

Автор sebi, 14 лет назад, По-английски

Suppose you have two variables x and y and you want to swap their values. The usual way to do this is using another temporary variable:

     temp = x;
     x = y;
     y = temp;

However, the interchange of two variables can be done without the temp variable:

     x = x + y;
     y = x - y;
     x = x - y;


What is your favourite algorithm for swapping variables?

  • Проголосовать: нравится
  • 0
  • Проголосовать: не нравится

14 лет назад, # |
  Проголосовать: нравится +3 Проголосовать: не нравится
Another alternative (if x and y don't share the same memory, as in the +/- case) is
x ^= y ^= x ^= y;
though this exact wording is not recommended.
  • 14 лет назад, # ^ |
      Проголосовать: нравится +5 Проголосовать: не нравится

    it is do not work in java. this code in C++.


    • 14 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      Yes, it doesn't work, because the expression is being calculated from left to right, so the first instance of variable x has the same value as it was before that line, despite of that logic says that it should be changed before we can do first XOR.
14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
> What is your favourite algorithm for swapping variables?

     t = x;
     x = y;
     y = t;
14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

+/- "solution" leads us to integer overflow. Really, best solution is swapping with temporary variable, and variant a ^= b ^= a ^= b (which have undefined behavior following C standard) is useful only when you have been taken interview for your new work, and have got task "swap two variables without using additional memory).

Also, good variant is std::swap. You code will be at least - readable.

14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
if x, y - int, double ... swap(x,y) :)
else 
p = x;
x = y; 
y = t;
14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
if x, y - int, double ... swap(x,y) :)
else
p = x;
x = y;
y = t;
  • 14 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    p = x;  => t=x;
  • 14 лет назад, # ^ |
      Проголосовать: нравится +1 Проголосовать: не нравится
    AFAIR, swap is template function, so I don;t understand why special case for non built-in type
    • 14 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      Hmm... it`s true... I think swap can't swapping structs and other variable...
      • 14 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        Why don't?? Swap can swapping structs and objects
        • 14 лет назад, # ^ |
            Проголосовать: нравится 0 Проголосовать: не нравится

          Oh, sorry... my bad English... it`s in past time...

          I say, that swap can swapping structs and other variable...

      • 14 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        It can.
        • 14 лет назад, # ^ |
            Проголосовать: нравится 0 Проголосовать: не нравится
          int x = 1;
          int y = 3;
          System.out.println("Before swap x=" + x + " , y=" + y);
          x = x ^ y;
          y = x ^ y;
          x = x ^ y;
          System.out.println("After swap x=" + x + " , y=" + y);

          This is similar to earlier mentioned 
          • 14 лет назад, # ^ |
              Проголосовать: нравится 0 Проголосовать: не нравится
            In Java you have to write it yourself (by XOR or with temporary variable), because it's impossible to write swap(x, y) in Java...And I don't like it .. It would be great if there were something like ref/out parameters in C#
14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Where are you from, lad?
14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
a, b = b, a