Dismiss Notice
Join Physics Forums Today!
The friendliest, high quality science and math community on the planet! Everyone who loves science is here!

Swapping 3 integers in C program

  1. Sep 21, 2007 #1
    Hi! i have a problem about swapping three integers in C program.
    Usually i use the call by reference for two integers only. Now for three i can't get t.
     
  2. jcsd
  3. Sep 21, 2007 #2

    Math Is Hard

    User Avatar
    Staff Emeritus
    Science Advisor
    Gold Member

    I usually create a temporary variable to hold a value while I am doing a swap. Would that do the trick?
     
  4. Sep 21, 2007 #3

    rcgldr

    User Avatar
    Homework Helper

    Or the old fashion way, more instructions but no temp variable for a swap:

    A ^= B
    B ^= A
    A ^= B

    A 3 variable swap is really a rotate.

    T = A
    A = B
    B = C
    C = T
     
  5. Sep 22, 2007 #4
    To swap 3 integer consider the following 2 methods:

    * divide to conquer: swap 2 by 2
    swap A & B
    A = B+A
    B = A-B
    A = A-B

    then swap A & C or B & C

    * all in one:
    let the variables A, B & C have the initial values A0,B0 & C0 respectively
    A = A+B+C (A0+B0+C0)
    B = A-B-C (A0+B0+C0 - B0 - C0 = A0)
    C = A-B-C (A0+B0+C0 - A0 - C0 = B0)
    A = A-B-C (A0+B0+C0 - A0 - B0 = C0)

    -----------------------------------------------------
    Correct me if I am wrong.
    http://ghazi.bousselmi.googlepages.com/présentation2
     
  6. Sep 22, 2007 #5
    thanks but i can't really get it!
    i was expeting of having at least 5lines. (because number of possible swaps=n!)
    indeed we are preparing our exam,the teacher didn't explain it clearly and he just told us to figure it out ourselves. please gimme an full example so that i can see the whole format.
     
  7. Sep 22, 2007 #6

    rcgldr

    User Avatar
    Homework Helper

    All possible swaps? There are 6 ways you can order 3 variables.

    A B C // no swaps
    A C B // swapsecondpair
    B A C // swapfirstpair
    B C A // swapfirstpair, swapsecondpair
    C A B // swapouterpair, swapsecondpair
    C B A // swapouterpair

    Code (Text):

    int A, B, C, T;

    void swapfirstpair()
    {
        T = A;
        A = B;
        A = T;
    }

    void swapsecondpair()
    {
        T = B;
        B = C;
        C = T;
    }

    void swapouterpair()
    {
        T = A
        A = C
        C = T
    }

     
     
    Last edited: Sep 22, 2007
  8. Sep 25, 2007 #7
    you can do this more efficiently and without rounding errors by using ^ to the same effect

    a ^= b ^ c;
    b ^= b ^ c;
    c ^= b ^ c;
    a ^= b ^ c;

    swap the variable names to change the swapping that is performed, you can extend this to n variables afaik... this works because ^ preserves information in the same way as + and -, except that because the operation is its own inverse there is one symbol instead of two, also because it is bitwise there is no precision loss.
     
  9. Oct 13, 2007 #8
    I can't believe people are recommending the triple xor trick. Yes it is clever, but it's pretty bad to use it in a language even as high level as C.

    Compiling your code with any optimization at all will cause the compiler to optimize out the temporary variable.

    If you're really interested in using assembleresque tricks, you might as well check out Sean Andersen's Bit Twiddling Hacks.
     
  10. Oct 21, 2007 #9
    with + and - there is no precision loss neither, there might be some cyclic overflows in the intermediate values, but the final results will always be correct.

    -----------------------------------------------------
    Correct me if I am wrong.
    http://ghazi.bousselmi.googlepages.com/présentation2
     
  11. Oct 21, 2007 #10

    Hurkyl

    User Avatar
    Staff Emeritus
    Science Advisor
    Gold Member

    As I recall, the C standard says that (signed) integer overflow results in undefined behavior.
     
  12. Oct 21, 2007 #11

    CRGreathouse

    User Avatar
    Science Advisor
    Homework Helper

    Probably. But if the computer uses IEEE arithmetic the overflow won't affect the result as tabchouri says. It would be best to comment this, but most modern systems use IEEE... yes?
     
  13. Oct 21, 2007 #12

    Hurkyl

    User Avatar
    Staff Emeritus
    Science Advisor
    Gold Member

    I thought IEEE only referred to floating point arithmetic? (In this context)

    But yes, most systems will do what you expect it to do. But you shouldn't assume it -- for example, what if someone using some fancy system decides to enable trapping of arithmetic overflow, so as to detect errors? Or you're using some fancy OS that uses trap bits in its integer representations to detect a variety of errors?



    I'm always amused by observations such as... signed integer overflow formatting your hard drive is permitted by the C standard. :smile:
     
    Last edited: Oct 21, 2007
  14. Oct 22, 2007 #13

    CRGreathouse

    User Avatar
    Science Advisor
    Homework Helper

    Yeah, you're right of course... what is the name for the standard I'm thinking of?

    Quite right, and amusing too. :D
     
Know someone interested in this topic? Share this thread via Reddit, Google+, Twitter, or Facebook

Have something to add?



Similar Discussions: Swapping 3 integers in C program
  1. C program (Replies: 4)

  2. C Program (Replies: 3)

  3. C program (Replies: 0)

  4. C programming (Replies: 9)

Loading...