Python Program för att byta ut två tal utan att använda den tredje variabeln

⚡ Smart sammanfattning

Swapping två tal utan en tredje variabel byter sina värden med hjälp av aritmetisk addition och subtraction, den bitvisa XOR-operatorn eller bitvis-aritmetiska trick. Python kan också byta direkt med tupeluppackning.

  • 🔘 Klassisk metod: Den vanliga swappen håller ett värde i en temporär variabel, vilket dessa tekniker undviker.
  • Aritmetisk växling: Byt ut värden med a = a + b, sedan b = a − b, sedan a = a − b.
  • 🔀 XOR-växling: Använd den bitvisa XOR-operatorn tre gånger för att byta heltal utan spill.
  • 🧮 Bitvis aritmetik: Använd AND-, OR- och komplementoperatorerna för att återge addition och subtraction.
  • 🐍 Python genväg: Tupeluppackning, a, b = b, a, byter ut två valfria värden på en rad.
  • 🤖 AI och data: Tupelbyten och NumPy-indexering omordnar arrayelement i förberedelser för maskininlärning.

Byt två Numbers Utan att använda en tredje variabel

Avsnitten nedan behandlar fyra sätt att byta utan en temporär variabel, plus aritmetiskt överflöde.

I programmeringsspråk, swapping innebär att utbyta värdena på två variabler. Variabeln kan innehålla ett tal, en sträng, en lista eller en array, ett objekt etc. Det allmänna sättet att bytaping är att använda en temporär variabel för att hålla värden. Till exempel,

Byt två Numbers

De allmänna stegen för byteping två siffror är:

  • Deklarera en temporär variabel C
  • Tilldela värdet av A till C, vilket betyder C = A. Nu är C = 20
  • Tilldela värdet av B till A, så A = 30
  • Tilldela värdet på C till B, så B = 20, eftersom C har värdet 20.

Så här byter manping görs med hjälp av en temporär variabel, och den fungerar för både heltal och flyttal.

Byt med aritmetisk ekvation

Som vi vet, bytping innebär att byta innehåll i två objekt, fält eller variabler. Att byta med hjälp av en aritmetisk operation innebär att utföra bytet med hjälp av en matematisk ekvation, dvs. addition och subtraktion.traction.

Om vi ​​får två tal och ombeds att byta plats utan att använda en temporär variabel, kan vi med hjälp av tre aritmetiska ekvationer byta plats på talen.

Pseudokod för swapping tal med hjälp av en aritmetisk operation:

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

Låt oss anta att vi har två tal, A = 20 och B = 30.

Villkor 1: A = A+B

Så, det aktuella värdet av A är 20 + 30 = 50

Villkor 2: B = AB

Nu är B = 50-30 = 20
Vi kan se att vi har värdet av A i B.

Villkor 3: A = AB

Slutligen, A = 50-20 = 30
A har initialvärdet B.

Så vi bytte bara siffrorna.

Här är programmet för att byta ut två tal i 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);
}

Produktion:

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

Program i 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))

Produktion:

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

Nu inne Python, behöver vi inte ens utföra aritmetiska operationer. Vi kan använda:

a,b = b,a

Här är en demonstration där a=20, b=30;

Byt med aritmetisk ekvation

Byt med Bitwise XOR Operator

Denna metod är också känd som XOR-swap. XOR betyder exklusiv ELLER. Vi tar två bitar som ingångar till XOR:en i denna bitvisa operation. För att få en utdata från XOR måste endast en indata vara 1. Annars blir utdata 0. Följande tabell visar utdata för alla kombinationer av indata A och B.

Vi behöver veta hur XOR-operationen fungerar för att växla två tal med hjälp av bitvis operation. Här är en tabell för XOR där A och B är ingångsvärdena.

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

Om två indata har samma värde ger XOR-operationen 0; annars 1. I det här exemplet använder vi en 3-gångers XOR-operation. I de flesta programmeringsspråk betecknas XOR som "^".

Låt oss anta att A=4 (i binärt läge = 0100) och B=7 (i binärt läge, 0111)

Villkor 1: A = A ^ B

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

Nu är A = 0011 (i binärt).

Villkor 2: B = A^B

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

Så B = 0100, vilket var det initiala binära värdet av A.

Villkor 3: A = A^B

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

Slutligen, A = 0111, vilket var det ekvivalenta binära värdet av B.

Program i 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);
}

Produktion:

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

Program i 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))

Produktion:

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

Swap Numbers använder Bitwise-Aritmetic

Den här metoden är densamma som den aritmetiska metoden, men vi kommer att använda bitvisa operationer som OCH, ELLER och komplement för att utföra addition och subtraktion.tracInnan vi går vidare till stegen, låt oss titta på "komplement" snabbt.

1-komplementet innebär att ändra alla 0 till 1 och 1 till 0. Låt oss ta ett exempel.

  • Låt oss anta talet 23, ett decimaltal.
  • Om vi ​​konverterar till binärt tal får vi 10111. Det finns bara 5 bitar, men datorn lagrar tal i 8, 16, 32, 64 ... bitar. Så låt oss lägga till noll framför det binära talet. Det kommer inte att ändra talets ursprungliga värde. Så det blir 00010111.
  • Som vi vet innebär ett 1-komplement att ändra alla 0 till 1 och 1 till 0, så att utföra ett 1-komplementet över 00010111 ger 11101000.

Detta etttalskomplement representeras med symbolen "~" i de flesta programmeringsspråk. Om du placerar detta symbol före heltal eller flyttal får du etttalskomplementet.

Och 2:s komplement betyder att lägga till binär "1" till 1:ans komplement. Om vi ​​gör 2:s komplement till ovanstående nummer:

  • Binär = 00010111
  • 1:ans komplement = 11101000
  • 2:ans komplement:

11101000

+ 1

11101001

Så, 2:s komplement är 11101001. Detta är binären för -23.
Sammanfattningsvis, för att utföra 2:s komplement till ett nummer A, kommer det att se ut så här:

2:s komplement till A = (~A) + 1

Låt oss nu anta att A=8 (binär 00001000), B=10 (00001010)

Villkor 1: A = (A & B) + (A | B)

Det är ekvivalent med A = A + B.

A & B = 00001000 & 00001010 = 00001000

A | B = 00001000 | 00001010 = 00001010

Nu, 00001000 + 00001010 = 00010010 (decimal 18)

Alltså, A = 18

Villkor 2: B = A + (~B) + 1

Det är ekvivalent med B = AB

Här är B = A – B

Utifrån ovanstående diskussion, om vi behöver utföra subtracI så fall utför vi tvåkomplement till det negativa talet och adderar det sedan.

Så -B = ~B + 1

Nu är B = 00010010 + (11110101) + 1 = 00001000

B:s värde motsvarar decimal 8, vilket var startvärdet.

Villkor 3: A = A + (~B) + 1

Det är ekvivalent med A = AB

Nu är A = 00010010 + 11110111 + 1

A = 00001010 (motsvarande decimal 10)

Slutligen fick A värdet av B. Således, bytetping blev avklarad.

Program i 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);
}

Produktion:

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

Program i 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))

Produktion:

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

Vad är Arithmetic Overflow?

Termen overflow betyder att man överskrider gränsen. Aritmetiskt overflow innebär att resultatet av en aritmetisk operation överskrider intervallet eller gränsen för datorarkitekturens talrepresentation. Om till exempel ett tal divideras med noll blir det oändligt, och datorns talsystem kan inte hålla det i 32 eller 64 bitar.

Heltalsrepresentation

Heltalsrepresentation i ett 32-bitarssystem

Konsekvensen av det aritmetiska överflödet kan vara:

  • Additionen av två positiva tal blir negativ, eftersom teckenbiten kan bli 1, vilket betyder ett negativt tal.
  • Additionen av två negativa tal blir positiv, eftersom teckenbiten kan bli 0, vilket betyder ett positivt tal.

Vanliga frågor

XOR-växlingping är intervjufavoriten: inget extra minne, inget överflöd. Aritmetik är en hyfsad backup, och Python utvecklare skriver vanligtvis bara a, b = b, a.

Nej. Bitvis XOR fungerar bara på heltalsbitmönster, inte flyttal, dubblar eller pekare. För flyttal, använd tupeluppackning eller aritmetisk swap istället.

Om båda variablerna delar en minnesplats, XOR-växlingping ställer in värdet till 0. Lägg till en if-kontroll när aliasing är möjlig.

Ja: a = a * b, b = a / b, a = a / b. Men det misslyckas när något av värdena är 0 och förlorar flyttalsprecisionen.

Endast tupeluppackning kan. Om man skriver a, b = b, byter a strängar, listor eller objekt. Aritmetik- och XOR-knepen är endast heltalsbaserade.

Knappt. Moderna kompilatorer optimerar redan temporära variabla swappar, så tricket förbättrar sällan hastigheten. Readable Kod är viktigare än att spara en variabel.

Ja. Maskininlärningskod byter värden med Python tupeluppackning, och numpy Indexering som arr[[i, j]] = arr[[j, i]] byter plats på arrayrader.

Ja. GitHub Copilot och liknande AI-assistenter producerar XOR-, aritmetiska och tupeluppackningsswappar från en prompt. RevVisa var och en för overflow- och aliasing-buggar.

Sammanfatta detta inlägg med: