int a,b; a=10; b=15;int t; t=a; a=b; b=t;
이 알고리즘은 이해하기 쉽고 특히 초보자가 컴퓨터 프로그램의 특성을 이해하는 데 적합합니다. 할당문의 고전적인 응용입니다. 실제 소프트웨어 개발에서 이 알고리즘은 간단하고 명확하며 모호성을 유발하지 않으며 프로그래머 간의 의사소통을 용이하게 합니다. 일반적인 상황에서는 변수 값을 교환하는 문제가 발생할 때 이 알고리즘(이하 표준 알고리즘이라고 함)을 사용해야 합니다.
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
원리는: a와 b를 숫자 축의 점으로 취급하고 두 점 사이의 거리를 기준으로 계산합니다.
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
위 연산을 통해 a와 b의 주소가 실제로 교환되었고, a는 원래 b가 가리키는 값을 가리키고, b는 원래 a가 가리키는 값을 가리키는 걸까요? 위의 코드는 컴파일 가능하지만 실행 결과는 놀랍습니다! 왜?
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)); }
알고리즘의 가장 큰 개선점은 비트 연산에서 AND 연산 "int(a)&0x0000ffff"를 사용한 점입니다. 주소의 상위 16비트가 세그먼트 주소이고, 마지막 16비트는 변위 주소입니다. 0x0000ffff로 AND를 하면 세그먼트 주소가 마스크되고 변위 주소만 유지됩니다. 이는 원래 알고리즘과 일치하며 올바른 결과를 얻습니다.
이 알고리즘도 제3의 변수를 사용하지 않고 값 교환을 완료합니다. 산술 알고리즘에 비해 이해하기 어렵지만, 큰 데이터 유형을 교환할 때 산술 알고리즘보다 실행 속도가 빠르다는 장점이 있습니다. 주소를 교환하기 때문에 변수값은 메모리에서 이동되지 않습니다. (이하 주소 알고리즘이라고 함)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;
이 알고리즘의 구현은 XOR 연산의 특성에 따라 결정됩니다. XOR 연산을 통해 데이터의 일부 비트가 반전될 수 있습니다. 다른 비트는 변경되지 않습니다. 이는 임의의 숫자와 주어진 값이 연속으로 두 번 XOR되고 값은 변경되지 않음을 의미합니다.
int exchange(int x,int y) { stack S; push(S,x); push(S,y); x=pop(S); y=pop(S); }
위 알고리즘은 모두 다른 변수의 도움 없이 두 변수 값의 교환을 구현합니다. 이에 비해 산술 알고리즘과 비트 산술은 동일한 계산량을 가지고 있으며, 주소 알고리즘의 계산은 더 복잡합니다. 그러나 대규모 계산은 쉽게 수행할 수 있지만 유형(예: 사용자 정의 클래스 또는 구조)은 정수 데이터만 교환할 수 있습니다(이론적으로 "^" 연산자를 오버로드하면 모든 구조의 교환이 가능함). ).
위 내용은 세 번째 변수를 사용하지 않고 두 변수의 값을 바꾸는 네 가지 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!