programing

온도 변수나 산술 연산을 사용하지 않고 두 개의 숫자를 교환하는 방법은 무엇입니까?

javamemo 2023. 8. 13. 09:03
반응형

온도 변수나 산술 연산을 사용하지 않고 두 개의 숫자를 교환하는 방법은 무엇입니까?

이 방정식은 임시 변수 없이 두 개의 숫자를 스왑하지만 산술 연산을 사용합니다.

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());
    
  • 타이를 사용하여 LValue 튜플 생성:

    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

반응형