온도 변수나 산술 연산을 사용하지 않고 두 개의 숫자를 교환하는 방법은 무엇입니까?
이 방정식은 임시 변수 없이 두 개의 숫자를 스왑하지만 산술 연산을 사용합니다.
a = (a+b) - (b=a);
제가 어떻게 산수 연산 없이 그것을 할 수 있습니까?저는 XOR에 대해 생각하고 있었습니다.
a=a+b;
b=a-b;
a=a-b;
이것은 간단하지만 효과적입니다.
왜 std libs를 사용하지 않습니까?
std::swap(a,b);
C에서는 다음과 같이 작동합니다.
a = a^b;
b = a^b;
a = a^b;
또는 더 멋진/괴상한 외모:
a^=b;
b^=a;
a^=b;
자세한 내용은 XOR을 참조하십시오. XOR은 매우 강력한 작업으로, 많은 흥미로운 사용법을 여기저기서 볼 수 있습니다.
임시 저장소나 산술 연산을 사용하지 않고 두 개의 숫자를 스왑하는 가장 좋은 방법은 두 변수를 레지스터에 로드한 다음 레지스터를 반대로 사용하는 것입니다.
C에서 직접 할 수는 없지만 컴파일러는 아마도 당신을 위해 그것을 해결할 수 있을 것입니다(최소한 최적화가 활성화된 경우) - 만약 당신이 케니가 어떤 코드를 작성한다면.TM은 그의 논평에서 제안했습니다.
예.
void swap_tmp(unsigned int *p)
{
unsigned int tmp;
tmp = p[0];
p[0] = p[1];
p[1] = tmp;
}
gcc 4.3.2를 사용하여 컴파일되었으며-O2
최적화 플래그는 다음을 제공합니다.
swap_tmp:
pushl %ebp ; (prologue)
movl %esp, %ebp ; (prologue)
movl 8(%ebp), %eax ; EAX = p
movl (%eax), %ecx ; ECX = p[0]
movl 4(%eax), %edx ; EDX = p[1]
movl %ecx, 4(%eax) ; p[1] = ECX
movl %edx, (%eax) ; p[0] = EDX
popl %ebp ; (epilogue)
ret ; (epilogue)
저는 이 C 솔루션을 본 적이 없지만, 누군가가 그것을 생각했을 것입니다.그리고 아마도 저보다 더 많은 게시물의 자제력이 있었을 것입니다.
fprintf(fopen("temp.txt", "w"), "%d", a);
a = b;
fscanf(fopen("temp.txt", "r"), "%d", &b);
추가 변수 없음!
저에게는 효과가 있지만 stdio 구현에 따라 출력 버퍼링에 대해 뭔가 조치를 취해야 할 수도 있습니다.
XOR을 사용하여,
void swap(int &a, int &b)
{
a = a ^ b;
b = a ^ b;
a = a ^ b;
}
XOR가 장착된 라이너 하나,
void swap(int &a, int &b)
{
a ^= b ^= a ^= b;
}
이 방법들은 어떤 테스트 사례에서도 실패하지 않기 때문에 깨끗해 보이지만, (방법 2에서와 같이) 변수 값이 동일한 시퀀스 포인트 내에서 두 번 수정되기 때문에, ANSI C에 의해 선언된 정의되지 않은 동작을 갖는다고 합니다.
C++11
허용되는 기능:
스왑 값:
std::swap(a, b);
스왑 범위:
std::swap_ranges(a.begin(), a.end(), b.begin());
-
std::tie(b, a) = std::make_tuple(a, b); std::tie(c, b, a) = std::make_tuple(a, b, c);
a =((a = a + b) - (b = a - b));
부호 있는 정수에 대해 값 중 하나가 범위를 벗어나면 두 변수 값을 이러한 방식으로 스왑할 수 있는 경우에 대한 위의 솔루션 외에도
a = a+b;
b=b-(-a);
a=b-a;
b=-(b);
곱셈과 나눗셈도 사용할 수 있습니다.
int x = 10, y = 5;
// Code to swap 'x' and 'y'
x = x * y; // x now becomes 50
y = x / y; // y becomes 10
x = x / y; // x becomes 5
언급URL : https://stackoverflow.com/questions/3647331/how-to-swap-two-numbers-without-using-temp-variables-or-arithmetic-operations
'programing' 카테고리의 다른 글
window.location.href를 사용하여 게시 데이터 전달 (0) | 2023.08.13 |
---|---|
RecyclerView 및 java.lang.Index Out Of Bounds 예외:불일치가 탐지되었습니다.잘못된 뷰 홀더 어댑터 위치View삼성 장치의 홀더 (0) | 2023.08.13 |
Tablet 기기에서 탭이 전체 너비를 차지하지 않음 [안드로이드 사용]서포트.디자인.위젯탭 레이아웃] (0) | 2023.08.13 |
Jquery 날짜 선택기 z 인덱스 문제 (0) | 2023.08.13 |
PowerShell로 빈 하위 폴더를 삭제하는 방법은 무엇입니까? (0) | 2023.08.13 |