Python 세 번째 변수를 사용하지 않고 두 숫자를 바꾸는 프로그램

⚡ 스마트 요약

교환ping 세 번째 변수가 없는 두 숫자는 산술 덧셈과 뺄셈을 사용하여 제자리에서 값을 교환합니다.trac비트 단위 XOR 연산자 또는 비트 단위 산술 트릭. Python 튜플 언패킹과 직접 교환할 수도 있습니다.

  • 🔘 고전적인 방법: 일반적인 스왑 방식은 하나의 값을 임시 변수에 저장하지만, 이러한 기법들은 그러한 방식을 피합니다.
  • 산술 연산 교환: a = a + b, b = a − b, 그리고 a = a − b로 값을 교환합니다.
  • 🔀 XOR 스왑: 비트 XOR 연산자를 세 번 적용하면 오버플로 없이 정수를 교환할 수 있습니다.
  • 🧮 비트 단위 연산: AND, OR 및 보수 연산자를 사용하여 덧셈과 뺄셈을 재현할 수 있습니다.trac기.
  • 🐍 Python 지름길: 튜플 언패킹, a, b = b, a,는 한 줄에 두 값을 서로 바꿉니다.
  • 🤖 인공지능과 데이터: 머신러닝 준비 과정에서 튜플 스왑과 NumPy 인덱싱을 사용하면 배열 요소의 순서가 바뀝니다.

2개 교환 Numbers 제3변수를 사용하지 않고

아래 섹션에서는 임시 변수 없이 값을 교환하는 네 가지 방법과 산술 오버플로에 대해 설명합니다.

프로그래밍 언어에서, 바꾸기ping 변수 값을 서로 바꾸는 것을 의미합니다. 변수에는 숫자, 문자열, 리스트 또는 배열, 객체 등이 포함될 수 있습니다. 변수 값을 바꾸는 일반적인 방법은 다음과 같습니다.ping 값을 저장하기 위해 임시 변수를 사용하는 것입니다. 예를 들어,

2개 교환 Numbers

스왑의 일반적인 단계ping 두 숫자는 다음과 같습니다.

  • 임시 변수 C를 선언합니다.
  • A의 값을 C에 할당합니다. 즉, C = A입니다. 이제 C = 20입니다.
  • B의 값을 A에 할당하므로 A = 30
  • C의 값을 B에 할당합니다. 따라서 C의 값은 20이므로 B = 20입니다.

이것이 바로 교환 방법입니다ping 이 작업은 임시 변수를 이용하여 수행되며, 정수와 부동 소수점 숫자 모두에 적용됩니다.

산술 방정식을 사용하여 바꾸기

아시다시피, 교환ping 교환이란 두 객체, 필드 또는 변수의 내용을 서로 바꾸는 것을 의미합니다. 산술 연산을 이용한 교환은 덧셈과 뺄셈과 같은 수학적 방정식을 사용하여 교환을 수행하는 것을 의미합니다.trac기.

두 숫자가 주어지고 임시 변수를 사용하지 않고 서로 바꾸라는 요청을 받으면 세 개의 산술 방정식을 사용하여 숫자를 바꿀 수 있습니다.

스왑에 대한 의사 코드ping 산술 연산을 사용하여 숫자를 계산하는 방법:

A = A + B
B = A - B
A = A - B

두 숫자 A = 20과 B = 30이 있다고 가정해 봅시다.

조건 1 : A = A+B

따라서 현재 A의 값은 20+30 = 50입니다.

조건 2 : B = AB

이제 B = 50-30 = 20
우리는 B에서 A의 값을 얻었음을 알 수 있습니다.

조건 3 : A = AB

마지막으로 A = 50-20 = 30
A의 초기값은 B입니다.

그래서 우리는 숫자만 바꾸었습니다.

다음은 C 언어로 두 숫자를 바꾸는 프로그램입니다.C++:

#include<stdio.h>
int main()
{
	int a, b;
	printf("Enter value of A: ");
	scanf("%d", & a);
	printf("Enter value of B: ");
	scanf("%d", & b);
	printf("A = %d, B = %d", a, b);
	a = a + b;
	b = a - b;
	a = a - b;
	printf("\nNow, A = %d, B = %d", a, b);
}

출력:

Enter value of A: 20
Enter value of B: 30
A = 20 , B = 30
Now, A = 30 , B = 20

에서 프로그램 Python:

a = int(input("Enter value of A: "))
b = int(input("Enter value of B: "))
print("A = {} and B = {}".format(a, b))
a = a + b
b = a - b
a = a - b
print("Now, A = {} and B = {}".format(a, b))

출력:

Enter value of A: 20
Enter value of B: 30
A = 20 , B = 30
Now, A = 30 , B = 20

지금의 Python심지어 산술 연산을 수행할 필요조차 없습니다. 다음과 같이 사용할 수 있습니다.

a,b = b,a

다음은 a=20, b=30인 경우를 보여주는 예시입니다.

산술 방정식을 사용하여 바꾸기

Bitwise XOR를 사용하여 스왑 Opera바위 산

이 방법은 XOR 스왑이라고도 합니다. XOR은 배타적 논리합(Exclusive OR)을 의미합니다. 이 비트 연산에서는 두 비트를 입력으로 사용합니다. XOR 연산에서 하나의 출력을 얻으려면 두 입력 중 하나만 1이어야 합니다. 그렇지 않으면 출력은 0이 됩니다. 다음 표는 입력 A와 B의 모든 조합에 대한 출력을 보여줍니다.

비트 연산을 사용하여 두 숫자를 바꾸려면 XOR 연산의 작동 방식을 알아야 합니다. 다음은 A와 B를 입력값으로 하는 XOR 연산에 대한 표입니다.

A B A XOR B
0 0 0
0 1 1
1 0 1
1 1 0

두 입력값이 같으면 XOR 연산 결과는 0이고, 그렇지 않으면 1입니다. 이 예제에서는 3의 XOR 연산을 사용하겠습니다. 대부분의 프로그래밍 언어에서 XOR 연산은 "^"로 표기합니다.

A=4(이진수로 0100)이고 B=7(이진수로 0111)이라고 가정해 보겠습니다.

조건 1 : A = A ^ B

A 0 1 0 0
B 0 1 1 1
A ^ B 0 0 1 1

이제 A = 0011(이진수)입니다.

조건 2 : B = A^B

A 0 0 1 1
B 0 1 1 1
A ^ B 0 1 0 0

따라서 B = 0100, 이는 A의 초기 이진값입니다.

조건 3 : A = A^B

A 0 0 1 1
B 0 1 0 0
A ^ B 0 1 1 1

마지막으로 A = 0111이며 이는 B와 동등한 이진 값입니다.

C/ 프로그램C++:

#include<stdio.h>
int main()
{
	int a, b;
	printf("Enter value of A: ");
	scanf("%d", & a);
	printf("Enter value of B: ");
	scanf("%d", & b);
	printf("A = %d, B = %d", a, b);
	a = a ^ b;
	b = a ^ b;
	a = a ^ b;
	printf("\nNow, A = %d, B = %d", a, b);
}

출력:

Enter value of A:4
Enter value of B:7
A=4, B=7
Now, A=7, B=4.

에서 프로그램 Python:

a = int(input("Enter value of A: "))
b = int(input("Enter value of B: "))
print("A = {} and B = {}".format(a, b))
a = a ^ b
b = a ^ b
a = a ^ b
print("Now, A = {} and B = {}".format(a, b))

출력:

Enter the value of A:10
Enter the value of B:15
A=10 and B=15
Now, A=15,B=10.

교환 Numbers 비트 산술 사용

이 방법은 산술적인 방법과 동일하지만, 덧셈과 뺄셈을 수행하기 위해 AND, OR, 보수와 같은 비트 연산을 사용합니다.trac단계별 설명에 앞서 "보완"이라는 단어를 간단히 살펴보겠습니다.

1의 보수란 모든 0을 1로, 모든 1을 0으로 바꾸는 것을 의미합니다. 예를 들어 보겠습니다.

  • 23이라는 소수를 예로 들어 보겠습니다.
  • 이진수로 변환하면 10111이 됩니다. 5비트밖에 없지만 컴퓨터는 8, 16, 32, 64비트 등으로 숫자를 저장합니다. 따라서 이진수 앞에 0을 추가해 보겠습니다. 이렇게 해도 숫자의 원래 값은 변하지 않습니다. 그러면 이진수는 10111이 됩니다. 00010111.
  • 우리가 알고 있듯이, 1의 보수는 모든 0을 1로, 모든 1을 0으로 바꾸는 것을 의미합니다. 따라서 1의 보수를 수행하면 다음과 같습니다. 00010111 제공 11101000.

대부분의 프로그래밍 언어에서 1의 보수는 "~" 기호로 표현됩니다. 정수 값이나 부동 소수점 값 앞에 이 기호를 붙이면 1의 보수가 됩니다.

그리고 2의 보수는 1의 보수에 이진수 "1"을 추가하는 것을 의미합니다. 위 숫자에 2의 보수를 하면:

  • 바이너리 = 00010111
  • 1의 보수 = 11101000
  • 2의 보수:

11101000

+ 1

11101001

따라서 2의 보수는 11101001입니다. 이것은 -23의 이진수입니다.
요약하면 숫자 A에 대한 2의 보수를 수행하면 다음과 같습니다.

A의 2의 보수 = (~A) + 1

이제 A=8(이진수 00001000), B=10(00001010)이라고 가정해 보겠습니다.

조건 1 : A = (A & B) + (A | B)

이는 A = A + B와 같습니다.

A & B = 00001000 & 00001010 = 00001000

A | B = 00001000 | 00001010 = 00001010

이제 00001000 + 00001010 = 00010010 (십진수 18)

따라서 A = 18입니다.

조건 2 : B = A + (~B) + 1

이는 B = AB와 같습니다.

여기서 B = A – B

위의 논의를 바탕으로, 만약 우리가 하위 작업을 수행해야 한다면trac이 경우 음수의 2의 보수를 취한 다음 더합니다.

따라서 -B = ~B + 1

이제 B = 00010010 + (11110101) + 1 = 00001000

B의 값은 초기값인 8진수 XNUMX과 같습니다.

조건 3 : A = A + (~B) + 1

이는 A = AB와 같습니다.

이제 A = 00010010 + 11110111 + 1

A = 00001010(10진수 XNUMX에 해당)

결국 A는 B의 값을 얻게 되었습니다. 따라서 교환이 이루어졌습니다.ping 완성됐다.

C/ 프로그램C++:

#include<stdio.h>
int main()
{
	int a, b;
	printf("Enter value of A: ");
	scanf("%d", & a);
	printf("Enter value of B: ");
	scanf("%d", & b);
	printf("A = %d, B = %d", a, b);
	a = (a & b) + (a | b);
	b = a + ~b + 1;
	a = a + ~b + 1;
	printf("\nNow, A = %d, B = %d", a, b);
}

출력:

Enter the value of A: 8
Enter the value of B:10
A=8, B=10
Now, A=10, B=8

에서 프로그램 Python:

a = int(input("Enter value of A: "))
b = int(input("Enter value of B: "))
print("A = {} and B = {}".format(a, b))
a = (a & b) + (a | b)
b = a + ~b + 1
a = a + ~b + 1
print("Now, A = {} and B = {}".format(a, b))

출력:

Enter the value of A: 25
Enter the value of B: 25
A = 25 and B = 25
Now, A = 25 and B = 25

산술 오버플로란 무엇입니까?

오버플로우라는 용어는 한계를 초과하는 것을 의미합니다. 산술 오버플로우는 어떤 산술 연산의 결과가 컴퓨터 아키텍처의 숫자 표현 범위 또는 한계를 초과하는 것을 말합니다. 예를 들어, 어떤 수를 0으로 나누면 그 수는 무한대가 되는데, 컴퓨터의 숫자 체계는 이를 32비트나 64비트로 표현할 수 없습니다.

정수 표현

32비트 시스템의 정수 표현

산술 오버플로의 결과는 다음과 같습니다.

  • 두 양수를 더하면 부호 비트가 1이 되어 음수가 될 수 있으므로 결과가 음수가 됩니다.
  • 두 음수를 더하면 부호 비트가 0이 되어 양수가 되기 때문에 결과가 양수가 됩니다.

자주 묻는 질문

XOR 스왑ping 면접에서 가장 선호되는 방식은 추가 메모리가 필요 없고 오버플로도 없다는 점입니다. 산술 연산 방식도 괜찮은 대안입니다. Python 개발자들은 보통 a, b = b, a라고 씁니다.

아니요. 비트 단위 XOR 연산은 정수 비트 패턴에만 적용되며, 부동 소수점, 실수 또는 포인터에는 적용되지 않습니다. 부동 소수점의 경우 튜플 언패킹이나 연산 교환을 사용해야 합니다.

두 변수가 하나의 메모리 위치를 공유하는 경우, XOR 연산을 통해 스왑합니다.ping 값을 0으로 설정합니다. 별칭 지정이 가능한 경우에는 항상 조건문을 추가하세요.

네, a = a * b, b = a / b, a = a / b입니다. 하지만 두 값 중 하나라도 0이면 소수점 정밀도가 손실되어 오류가 발생합니다.

튜플 언패킹만 가능합니다. `a, b = b, a`와 같이 작성하면 문자열, 리스트 또는 객체가 서로 바뀝니다. 산술 및 XOR 연산은 정수에만 적용됩니다.

거의 효과가 없습니다. 최신 컴파일러는 이미 임시 변수 교환을 최적화하므로 이 방법은 속도 향상에 거의 도움이 되지 않습니다. Readable 코드 자체가 변수 하나를 저장하는 것보다 더 중요합니다.

예. 머신러닝 코드는 값을 서로 바꿉니다. Python 튜플 언패킹 및 눔 파이 arr[[i, j]] = arr[[j, i]]와 같은 인덱싱은 배열의 행을 제자리에서 바꿉니다.

네. GitHub Copilot과 같은 AI 도우미는 사용자가 입력하는 대로 XOR 연산, 산술 연산, 튜플 언패킹 등의 스왑 연산을 수행합니다. Rev오버플로 및 앨리어싱 버그를 확인하기 위해 각각을 검토하십시오.

이 게시물을 요약하면 다음과 같습니다.