Home >Java >javaTutorial >Four ways to swap the values of two variables without using the third variable
int a,b; a=10; b=15;int t; t=a; a=b; b=t;
This algorithm is easy to understand and is especially suitable for helping beginners understand the characteristics of computer programs. It is a classic application of assignment statements. In actual software development, this algorithm is simple and clear, does not cause ambiguity, and facilitates communication between programmers. Under normal circumstances, this algorithm (hereinafter referred to as the standard algorithm) should be used when encountering the problem of exchanging variable values.
int a,b; a=10;b=12; a=b-a; //a=2;b=12b=b-a; //a=2;b=10a=b+a; //a=10;b=10
The principle is: treat a and b as points on the number axis, and perform them around the distance between the two points calculate.
int *a,*b; //假设*a=new int(10);*b=new int(20); //&a=0x00001000h,&b=0x00001200ha=(int*)(b-a); //&a=0x00000200h,&b=0x00001200hb=(int*)(b-a); //&a=0x00000200h,&b=0x00001000ha=(int*)(b+int(a)); //&a=0x00001200h,&b=0x00001000h
Through the above operation, the addresses of a and b have really been exchanged, and a points to the value originally pointed to by b, and does b point to the value originally pointed to by a? The above code can be compiled, but the execution results are incredible! Why?
if(a<b) { a=(int*)(b-a); b=(int*)(b-(int(a)&0x0000ffff)); a=(int*)(b+(int(a)&0x0000ffff)); }else{ b=(int*)(a-b); a=(int*)(a-(int(b)&0x0000ffff)); b=(int*)(a+(int(b)&0x0000ffff)); }
The biggest improvement of the algorithm is to use the AND operation "int(a)&0x0000ffff" in the bit operation, because the upper 16 bits of the address are the segment address, and the last 16 bits are the displacement address. After ANDing it with 0x0000ffff, the segment address is masked and only the displacement address is retained. This matches the original algorithm and gets the correct result.
This algorithm also completes the exchange of values without using a third variable. Compared with arithmetic algorithms, it is difficult to understand, but it has its advantage, that is, when exchanging large data types, its execution speed is faster than arithmetic. The algorithm is fast. Because it exchanges addresses, but the variable value has not been moved in memory. (Hereinafter referred to as the address algorithm)int a=10,b=12; //a=1010^b=1100;a=a^b; //a=0110^b=1100;b=a^b; //a=0110^b=1010;a=a^b; //a=1100=12;b=1010;
The realization of this algorithm is determined by the characteristics of the XOR operation. Through the XOR operation, Some bits in the data are flipped, while other bits are unchanged. This means that any number and any given value are XORed twice in a row, and the value remains unchanged.
int exchange(int x,int y) { stack S; push(S,x); push(S,y); x=pop(S); y=pop(S); }
The above algorithms all realize the exchange of two variable values without the help of other variables. In comparison, the arithmetic algorithm and the bit algorithm have the same amount of calculation, and the calculation in the address algorithm is more complicated. , but can easily realize the exchange of large types (such as custom classes or structures), while the first two can only exchange integer data (in theory, overloading the "^" operator can also realize the exchange of any structure) ).
The above is the detailed content of Four ways to swap the values of two variables without using the third variable. For more information, please follow other related articles on the PHP Chinese website!