프로그래밍에서 언어 스와핑은 두 변수의 값을 바꾸는 것을 의미합니다. 변수에는 숫자, 문자열, 목록 또는 배열, 개체 등이 포함될 수 있습니다. 스와핑의 일반적인 방법은 임시 변수를 사용하여 값을 유지하는 것입니다. 예를 들어,두 숫자를 교환하는 일반적인 단계는 다음과 같습니다.
임시 변수 C 선언
C = A를 의미하는 A의 값을 C에 할당하십시오. 이제 C = 20
B 값을 A에 할당하므로 A = 30
C의 값을 B에 할당하여 C의 값이 20이므로 B = 20입니다.
임시 변수를 사용하여 스와핑을 수행하는 방법입니다. 이 방법은 정수와 부동 소수점 숫자 모두에 대해서도 작동합니다.
산술 방정식을 사용한 스왑
알다시피, 스와핑은 두 개체 또는 필드 또는 변수의 내용을 교환하는 것을 의미합니다. 산술 연산을 이용한 스왑은 덧셈과 뺄셈과 같은 수학식을 이용하여 스왑 연산을 수행하는 것을 의미한다. 두 개의 숫자가 주어지고 임시 변수를 사용하지 않고 바꾸도록 요청받은 경우 세 개의 산술 방정식을 사용하여 숫자를 바꿀 수 있습니다. 산술 연산을 사용하여 숫자를 교환하기 위한 의사 코드:
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
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
파이썬 프로그램:
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 연산자를 사용하여 스왑
이 방법을 XOR 스왑이라고도 합니다. XOR은 배타적 논리합을 의미합니다. 이 비트 연산에서 XOR에 대한 입력으로 두 비트를 사용합니다. XOR에서 하나의 출력을 얻으려면 하나의 입력만 1이어야 합니다. 그렇지 않으면 출력은 0이 됩니다. 다음 표는 입력 A B의 모든 조합에 대한 출력을 보여줍니다. 비트 연산을 사용하여 두 숫자를 교환하기 위해 XOR 연산이 어떻게 작동하는지 알아야 합니다. 다음은 A와 B가 입력 값인 XOR에 대한 표입니다.
ㅏ
비
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
ㅏ
0
1
0
0
비
0
1
1
1
A ^ B
0
0
1
1
이제 A = 0011(바이너리)입니다. 조건 2: B = A^B
ㅏ
0
0
1
1
비
0
1
1
1
A ^ B
0
1
0
0
따라서 B = 0100, A의 초기 이진 값이었습니다. 조건 3: A = A^B
ㅏ
0
0
1
1
비
0
1
0
0
A ^ B
0
1
1
1
마지막으로 A = 0111로 B와 동등한 이진 값입니다. C/C++의 프로그램:
#include
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.
파이썬 프로그램:
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.
비트 산술을 사용하여 숫자 바꾸기
이 방법은 산술 방법과 동일하지만 AND, OR 및 Compliment와 같은 Bitwise 연산을 사용하여 더하기 및 빼기를 수행합니다. 단계로 이동하기 전에 '칭찬'을 빠르게 살펴보겠습니다. 1의 보수는 모든 0을 1로, 1을 0으로 바꾸는 것을 의미합니다. 예를 들어보겠습니다.
10진수인 숫자 23을 가정해 봅시다.
바이너리로 변환하면 10111이 사용됩니다. 5비트만 있지만 컴퓨터는 8,16,32,64 .. 비트에 숫자를 저장합니다. 따라서 Binary 앞에 0을 추가해 보겠습니다. 숫자의 원래 값은 변경되지 않습니다. 그래서 될 것이다 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(2진법 00001000), B=10(00001010)이라고 가정하겠습니다. 조건 1: A = (A & B) + (A | B) A = A + B와 같습니다. A & B = 00001000 & 00001010 = 00001000 에이 | B = 00001000 | 00001010 = 00001010 이제 00001000 + 00001010 = 00010010(십진수 18) 따라서 A = 18 조건 2: B = A + (~B) + 1 B = AB에 해당 여기서 B = A – B 위의 논의에서 빼기를 수행해야 하는 경우 음수에 대해 2의 보수를 수행한 다음 더합니다. 따라서 -B = ~B + 1 이제 B = 00010010 + (11110101) + 1 = 00001000 B의 값은 초기 값인 십진수 8에 해당합니다. 조건 3: A = A + (~B) + 1 A = AB와 동일 이제 A = 00010010 + 11110111 + 1 A = 00001010(십진수 10에 해당) 마지막으로 A는 B의 값을 얻었습니다. 이로써 스와핑이 완료되었습니다. C/C++의 프로그램:
#include
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
파이썬 프로그램:
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이 될 수 있기 때문입니다.
댓글