XOR swap algorithm

XOR swap algorithm

In computer programming, the XOR swap is an algorithm that uses the XOR bitwise operation to swap distinct values of variables having the same data type without using a temporary variable.

The algorithm

Standard swapping algorithms require the use of a temporary storage variable. Using the XOR swap algorithm, however, no temporary storage is needed. The algorithm is as follows: X := X XOR Y Y := X XOR Y X := X XOR YThe algorithm typically corresponds to three machine code instructions. For example, in IBM System/370 assembly code: XR R1,R2 XR R2,R1 XR R1,R2where R1 and R2 are registers and each XR operation leaves its result in the register named in the first argument.

However, the problem still remains that if "x" and "y" use the same storage location, the value stored in that location will be zeroed out by the first XOR instruction, and then remain zero; it will not be "swapped with itself". (Note that this is "not" the same as if "x" and "y" have the same values. The trouble only comes when "x" and "y" use the same storage location.)

Proof that the XOR swap works

The binary operation XOR over bit strings of length N exhibits the following properties (where oplus denotes XOR): [The first three properties, along with the existence of an inverse for each element, are the definition of an Abelian group. The last property is a structural feature of XOR not necessarily shared by other Abelian groups, nor groups in general.]
* L1. Commutativity: A oplus B = B oplus A
* L2. Associativity: (A oplus B) oplus C = A oplus (B oplus C)
* L3. Identity exists: there is a bit string, 0, (of length "N") such that A oplus 0 = A for any A
* L4. Each element is its own inverse: for each A, A oplus A = 0.

Suppose that we have two registers R1 and R2, as in the table below, with initial values "A" and "B" respectively. We perform the operations below in sequence, and reduce our results using the properties listed above.

Code example

A C function that implements the XOR swap algorithm: void xorSwap (int *x, int *y) { if (x != y) { *x ^= *y; *y ^= *x; *x ^= *y; } }Note that the code does not swap the integers passed immediately, but first checks if their memory locations are distinct. This will remove problems caused by possible aliasing.

The body of this function is sometimes seen incorrectly shortened to if (x != y) *x^=*y^=*x^=*y;. This code has undefined behavior, since it modifies the lvalue *x twice without an intervening sequence point.

Reasons for use in practice

The algorithm is not uncommon in embedded assembly code,Fact|date=July 2007 where there is often very limited space available for a temporary swap variable, and this form of swap can also avoid a load/store which can be much faster than the equivalent operation using a temporary variable. On some architectures, certain operations require their operands to be in particular registers, requiring a swap; and all available "temporary" registers may be in use storing other data. Some optimizing compilers can generate code using XOR swap in these situations.Fact|date=April 2007

Reasons for avoidance in practice

Most modern compilers can optimize away the temporary variable in the naive swap, in which case the naive swap uses the same amount of memory and the same number of registers as the XOR swap and is at least as fast, and often faster. [http://big-bad-al.livejournal.com/98093.html] As a general rule, you should never use the XOR swap unless you know for a fact that the naive swap will not suit your application (which is very rare in this day and age). The XOR swap is also much less readable, and can be completely opaque to anyone who isn't already familiar with the technique.

On modern (desktop) CPUs, the XOR technique is considerably slower than using a temporary variable to do swapping. One reason is that modern CPUs strive to execute commands in parallel; see Instruction pipeline. In the XOR technique, the inputs to each operation depend on the results of the previous operation, so they must be executed in strictly sequential order. If efficiency is of tremendous concern, it is advised to test the speeds of both the XOR technique and temporary variable swapping on the target architecture.

The XCHG instruction

Modern optimizing compilers work by translating the code they are given into an internal flow-based representation which they transform in many ways before producing their machine-code output. These compilers are more likely to recognize and optimize a conventional (temporary-based) swap than to recognize the high-level language statements that correspond to an XOR swap. Many times, what is written as a swap in high-level code is translated by the compiler into a simple internal note that two variables have swapped memory addresses, rather than any amount of machine code. Other times, when the target architecture supports it, the compiler can use a single XCHG (exchange) instruction which performs the swap in a single operation.

An XCHG operation was available as long ago as 1964, on the PDP-6 (where it was called EXCH) and in 1970 on the Datacraft 6024 series (where it was called XCHG). The Intel 8086, released in 1978, also included an instruction named XCHG. All three of these instructions swapped registers with registers, or registers with memory, but were unable to swap the contents of two memory locations. The Motorola 68000's EXG operation can only swap registers with registers. The PDP-10 inherited the PDP-6's EXCH instruction, but the PDP-11 (the machine on which the C programming language was developed) did not.

However, the XCHG instruction in modern processors (e.g. x86) should only be used to swap registers and not memory, as an implicit "LOCK" instruction may be imposed by the processor on the memory location(s) involved so that the operation is atomic.

Aliasing

The XOR swap is also complicated in practice by aliasing. As noted above, if an attempt is made to XOR-swap the contents of some location with itself, the result is that the location is zeroed out and its value lost. Therefore, XOR swapping must not be used blindly in a high-level language if aliasing is possible.

Variations

The underlying principle of the XOR swap algorithm can be applied to any reversible binary operation. Replacing XOR by addition and subtraction gives a slightly different, but largely equivalent, formulation:

void addSwap (int *x, int *y) { if (x != y) { *x = *x + *y; *y = *x - *y; *x = *x - *y; } }

Unlike the XOR swap, this variation requires that the underlying processor or programming language uses a method such as modular arithmetic or bignums to guarantee that the computation of X + Y cannot cause an error due to integer overflow. Therefore, it is seen even more rarely in practice than the XOR swap.

Notes

ee also

*Symmetric difference
*XOR linked list


Wikimedia Foundation. 2010.

Игры ⚽ Нужен реферат?

Look at other dictionaries:

  • XOR linked list — XOR linked lists are a data structure used in computer programming. They take advantage of the bitwise exclusive disjunction (XOR) operation, here denoted by ⊕, to decrease storage requirements for doubly linked lists. An ordinary doubly linked… …   Wikipedia

  • Swap (computer science) — For other uses of swap , see swap (disambiguation). In computer programming, the act of swapping two variables refers to mutually exchanging the values of the variables. Usually, this is done with the data in memory. For example, in a program,… …   Wikipedia

  • Échange (informatique) — En programmation informatique, l échange de deux variables (en anglais swap) consiste à intervertir leurs valeurs. Il s agit d une opération de base intégrée à de nombreux langages de programmation et faisant partie du jeu d instructions de… …   Wikipédia en Français

  • Exclusive or — The logical operation exclusive disjunction, also called exclusive or (symbolized XOR or EOR), is a type of logical disjunction on two operands that results in a value of “true” if and only if exactly one of the operands has a value of “true”. [… …   Wikipedia

  • List of algorithms — The following is a list of the algorithms described in Wikipedia. See also the list of data structures, list of algorithm general topics and list of terms relating to algorithms and data structures.If you intend to describe a new algorithm,… …   Wikipedia

  • Bitwise operation — In computer programming, a bitwise operation operates on one or two bit patterns or binary numerals at the level of their individual bits. On most microprocessors, bitwise operations are sometimes slightly faster than addition and subtraction… …   Wikipedia

  • Алгоритм обмена при помощи исключающего ИЛИ — В программировании, обмен при помощи исключающего ИЛИ (англ. Xor swap algorithm, кзор своп алгоритм)  это алгоритм, в котором используется операция исключающего ИЛИ (XOR), для обмена значениями между переменными, которые содержат данные …   Википедия

  • Зор-своп алгоритм — В программировании, обмен при помощи исключающего ИЛИ (англ. Xor swap algorithm, кзор своп алгоритм)  это алгоритм, который использует операцию исключающего ИЛИ (XOR) для обмена различных значений переменных, имеющих один и тот же тип данных без… …   Википедия

  • Temporary variable — In computer programming, a temporary variable is a variable whose purpose is short lived, usually to hold temporarily data that will soon be discarded, or before it can be placed at a more permanent memory location. Because it is short lived, it… …   Wikipedia

  • Aliasing (computing) — In computing, aliasing describes a situation in which a data location in memory can be accessed through different symbolic names in the program. Thus, modifying the data through one name implicitly modifies the values associated to all aliased… …   Wikipedia

Share the article and excerpts

Direct link
Do a right-click on the link above
and select “Copy Link”