두 가지 이상의 방식으로 두 개의 번호를 교환하다.

이 문제를 겪지 않은 프로그래머는 한 명도 없다.

Write a program to swap two numbers.


임시 변수를 사용하여 두 개의 숫자를 교환하는 것은 매우 흔하다.그러나 다른 교환 방식도 있다.나는 몇 가지 방법을 열거했다.

할당 해제


ES2015에서 소개한 해체부치 교환 숫자를 사용하기 전에 그것이 무엇인지 알아보자.
var a, b;

[a, b] = [33, 22, 11];

console.log(a, b) // 33 22
[a, b] = [33, 22, 11]는 분해수조[33, 22, 11]의 분해부치다.제1항 33은 변수 a에 분배하고, 제2항 22는 변수 b에 분배한다.
이 점을 알았으니 지금 교환합시다.
let a = 12, b = 24;

[a, b] = [b, a]; // destructuring assignment

console.log(`a = ${a}, b = ${b}`); // a = 24, b = 12
분해 작업의 단계별 분해:
  • 는 임시 그룹 [b, a]을 만들 것입니다. 그 값은 [24, 12]입니다.
  • 분해 발생[a, b] = [24, 12], 변수 a는 24, 변수 b는 12.
  • 가화차


    이런 방법은 간단한 수학 논리를 사용하여 문제 진술을 해결한다.
    var a = 12, b = 24;
    
    a = a + b; // a = 36
    b = a - b; // b = 36 - 24 = 12
    a = a - b; // a = 36 - 12 = 24
    
    console.log(`a = ${a}, b = ${b}`) // a = 24, b = 12
    
    그러나 이런 방법에도 한계가 있다.
  • 우리는 정수만 교환할 수 있다
  • 1단계a = a + b의 합은 Number.MAX_SAFE_INTEGER보다 낮아야 한다NaN
  • Note: You can do this swapping in one line :
    num2 = num1 + ( num1 = num2 ) - num2;
    I am using num1 and num2 for easy understanding


    곱셈과 나눗셈을 사용하다


    이런 방법도 논리에 맞는 기술의 일종이다.그것은 앞의 방법과 거의 같지만, 단지 업그레이드일 뿐이다. 즉, 덧셈이 아니라 곱셈을 사용하고, 뺄셈이 아니라 나눗셈을 사용한다는 것이다.
    var a = 12, b = 24;
    
    a = a * b; // a = 288
    b = a / b; // b = 288 / 24 = 12
    a = a / b; // a = 288 / 12 = 24
    
    console.log(`a = ${a}, b = ${b}`) // a = 24, b = 12
    
    이 접근 방식의 한계에 대해 살펴보겠습니다.
    0은 곱셈과 나눗셈의 적이다.숫자 중 하나가 0이면 이 방법을 사용하지 마십시오.이로 인해 Infinity
  • -InfinityNaN를 숫자 중의 하나로 삼는 것을 피한다.답은 다시 발생할 것이다a ^ b.
  • Note: You can do this swapping in one line :
    num2 = num1 * ( num1 = num2 ) / num2;
    I am using num1 and num2 for easy understanding


    비트별 또는 연산자


    이 방법을 사용하기 전에 XOR 연산자를 수정합니다.두 입력이 다르면 XOR 연산자가 true로 돌아갑니다.아래 표와 같다.
    하나
    b
    a^b
    0
    0
    0
    0
    1
    1
    1
    0
    1
    1
    1
    0
    이런 논리를 사용하면 우리는 두 개의 정수를 교환할 수 있다.값이 5인 var a와 값이 9인 var b를 교환하는 절차는 다음과 같다.
  • 변수 a와 b의 이진 등가물은 다음과 같다.
    a=5=0101,b=9=1001
  • 값은 a에 저장됩니다.
  • a = a ^ b
    
    하나
    b
    a=a^b
    0
    1
    1
    1
    0
    1
    0
    0
    0
    1
    1
    0
  • 값은 a ^ b에 저장됩니다.
  • b = a ^ b
    
    하나
    b
    b=a^b
    1
    1
    0
    1
    0
    1
    0
    0
    0
    0
    1
    1
  • 값은 b에 저장됩니다.
  • a = a ^ b
    
    하나
    b
    a=a^b
    1
    0
    1
    1
    1
    0
    0
    0
    0
    0
    1
    1
  • 이때 변수 a보존치 1001, 즉 9, 변수 b보존치 0101, 즉 5.그래서 우리는 값이 바뀌는 것을 보았다.
  • var a = 12, b = 24;
    
    a = a ^ b; 
    b = a ^ b; 
    a = a ^ b; 
    
    console.log(`a = ${a}, b = ${b}`) // a = 24, b = 12
    
    이제 이러한 접근 방식의 한계를 살펴보겠습니다.
  • 우리는 소수점을 교환할 수 없다. 왜냐하면 우리는 숫자의 정수 부분만 얻기 때문이다.XOR 은 입력이 정수인 경우 적절한 계산을 수행합니다.그러나 부동점수는 정수가 아니다. IEEE 754 표준에 의해 표시된다. 이 표준은 숫자를 세 부분으로 나눈다. 하나는 기호 위치, 하나는 지수의 위치를 나타내고, 다른 하나는 1(포함)과 2(포함하지 않음) 사이의 숫자, 끝수를 나타낸다.그래서 우리는 잘못된 값을 얻었다.
  • 우리는 a ^ ba를 사용할 수 없다. 왜냐하면 그들은 부점 정수이고 위와 같은 문제에 직면하기 때문이다.
  • iLife 사용


    IIFE 또는 즉시 호출된 함수 표현식은 함수 생성 후 즉시 실행되는 함수입니다.그것은 두 개의 숫자를 교환하는 등 여러 가지 일을 할 수 있다.
    var a = 12, b = 24;
    
    a = (function (b) {
        return b;
    })(b, b = a)
    
    console.log(`a = ${a}, b = ${b}`) // a = 24, b = 12
    

    I won't prefer this method. Just included for sharing knowledge.


    임시 변수 사용


    이것은 가장 상용하는 방법이다.교환에 사용할 값을 저장하기 위해 임시 변수를 사용합니다.
    var a = 12, b = 24, temp;
    
    temp = a; // temp = 12
    a = b;    // a = 24
    b = a;    // b = 12
    
    console.log(`a = ${a}, b = ${b}`) // a = 24, b = 12
    

    결론


    교환의 요점을 만들었습니다. 찾을 수 있습니다. here
    교환하는 방법은 아직 많다.나는 몇 가지 더 좋은 선택을 열거했다.만약 당신이 더 많은 기교를 알고 있다면, 평론에서 공유할 수 있습니다.

    좋은 웹페이지 즐겨찾기