Python Program til at bytte om på to tal uden at bruge den tredje variabel

⚡ Smart opsummering

Swapping To tal uden en tredje variabel bytter deres værdier ved hjælp af aritmetisk addition og subtraktiontraction, den bitvise XOR-operator eller bitvis-aritmetiske tricks. Python kan også bytte direkte med tuple-udpakning.

  • 🔘 Klassisk metode: Den sædvanlige swap holder én værdi i en midlertidig variabel, hvilket disse teknikker undgår.
  • Aritmetisk bytte: Byt værdier med a = a + b, derefter b = a − b, og derefter a = a − b.
  • 🔀 XOR-bytte: Anvend den bitvise XOR-operator tre gange for at bytte om på heltal uden overløb.
  • 🧮 Bitvis aritmetik: Brug AND-, OR- og komplementoperatorerne til at reproducere addition og subtraction.
  • 🐍 Python genvej: Tuple-udpakning, a, b = b, a, bytter om på to værdier på én linje.
  • 🤖 AI og data: Tuple-swaps og NumPy-indeksering omarrangerer array-elementer i forberedelse af maskinlæring.

Byt to Numbers Uden at bruge en tredje variabel

Afsnittene nedenfor dækker fire måder at bytte uden en midlertidig variabel, plus aritmetisk overløb.

I programmeringssprog, swapping betyder at udveksle værdierne af to variabler. Variablen kan indeholde et tal, en streng, en liste eller et array, et objekt osv. Den generelle måde at bytte påping er at bruge en midlertidig variabel til at holde værdier. For eksempel,

Byt to Numbers

De generelle trin i bytteprocessenping to tal er:

  • Deklarér en midlertidig variabel C
  • Tildel værdien af ​​A til C, hvilket betyder C = A. Nu er C = 20
  • Tildel værdien af ​​B til A, så A = 30
  • Tildel værdien af ​​C til B, så B = 20, da C har værdien 20.

Sådan bytter manping gøres ved hjælp af en midlertidig variabel, og det virker for både heltal og flydende tal.

Byt ved hjælp af aritmetisk ligning

Som vi ved, bytteping betyder at udskifte indholdet af to objekter, felter eller variabler. Byt ved hjælp af en aritmetisk operation betyder at udføre byttet ved hjælp af en matematisk ligning, dvs. addition og subtraktion.traction.

Hvis vi får to tal og bliver bedt om at bytte om uden at bruge en midlertidig variabel, kan vi bytte tallene ved hjælp af tre aritmetiske ligninger.

Pseudokode til swapping tal ved hjælp af en aritmetisk operation:

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

Lad os antage, at vi har to tal, A = 20 og B = 30.

Betingelse 1: A = A+B

Så den nuværende værdi af A er 20 + 30 = 50

Betingelse 2: B = AB

Nu er B = 50-30 = 20
Vi kan se, at vi har værdien af ​​A i B.

Betingelse 3: A = AB

Endelig er A = 50-20 = 30
A har startværdien af ​​B.

Så vi har bare byttet tallene.

Her er programmet til at bytte om på to 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);
}

Output:

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

Output:

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

Nu i Python, behøver vi ikke engang at udføre aritmetiske operationer. Vi kan bruge:

a,b = b,a

Her er en demonstration hvor a=20, b=30;

Byt ved hjælp af aritmetisk ligning

Skift med Bitwise XOR OperaTor

Denne metode er også kendt som XOR-swap. XOR betyder eksklusiv ELLER. Vi tager to bits som input til XOR'en i denne bitvise operation. For at få ét output fra XOR skal kun ét input være 1. Ellers vil outputtet være 0. Følgende tabel viser outputtet for alle kombinationer af input A og B.

Vi skal vide, hvordan XOR-operationen fungerer for at bytte om på to tal ved hjælp af den bitvise operation. Her er en tabel for XOR, hvor A og B er inputværdierne.

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

Hvis to input har samme værdi, giver XOR-operationen 0; ellers 1. I dette eksempel bruger vi en 3 XOR-operation. I de fleste programmeringssprog betegnes XOR som "^".

Lad os antage A=4 (i binær = 0100) og B=7 (i binær, 0111)

Betingelse 1: A = A ^ B

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

Nu er A = 0011 (i binært).

Betingelse 2: B = A^B

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

Så B = 0100, som var den indledende binære værdi af A.

Betingelse 3: A = A^B

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

Endelig er A = 0111, som var den ækvivalente binære værdi af 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);
}

Output:

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

Output:

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

Swap Numbers ved hjælp af Bitwise-Aritmetic

Denne metode er den samme som den aritmetiske metode, men vi bruger bitvise operationer som AND, OR og komplement til at udføre addition og subtraktiontracLad os se nærmere på ordet "komplement", før vi går videre til trinene.

1'ers komplement betyder at ændre alle 0'ere til 1 og 1 til 0. Lad os tage et eksempel.

  • Lad os antage tallet 23, et decimaltal.
  • Konvertering til binært tal giver os 10111. Der er kun 5 bit, men computeren gemmer tal i 8, 16, 32, 64 ... bit. Lad os derfor tilføje nul foran det binære tal. Det vil ikke ændre tallets oprindelige værdi. Så det bliver 00010111.
  • Som vi ved, betyder 1'ers komplement at ændre alle 0'ere til 1 og 1 til 0, så at udføre 1'ers komplement igen 00010111 giver 11101000.

Dette 1-talskomplement er repræsenteret med symbolet "~" i de fleste programmeringssprog. Hvis dette symbol sættes før heltalsværdier eller flydende kommaværdier, får du 1-talskomplementet.

Og 2's komplement betyder at tilføje binært "1" til 1'erens komplement. Hvis vi gør 2'er komplement til ovenstående tal:

  • Binær = 00010111
  • 1'ers komplement = 11101000
  • 2'er komplement:

11101000

+ 1

11101001

Så 2's komplement er 11101001. Dette er binær for -23.
Sammenfattende, for at udføre 2's komplement af et nummer A, vil det se sådan ud:

2's komplement af A = (~A) + 1

Lad os nu antage A=8 (binær 00001000), B=10 (00001010)

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

Det svarer til A = A + B.

A & B = 00001000 & 00001010 = 00001000

A | B = 00001000 | 00001010 = 00001010

Nu, 00001000 + 00001010 = 00010010 (decimal 18)

Så A = 18

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

Det svarer til B = AB

Her er B = A – B

Ud fra ovenstående diskussion, hvis vi har brug for at udføre subtracI denne sætning udfører vi 2'ers komplement til det negative tal og lægger det derefter sammen.

Altså -B = ~B + 1

Nu er B = 00010010 + (11110101) + 1 = 00001000

B's værdi svarer til decimal 8, som var startværdien.

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

Det svarer til A = AB

Nu er A = 00010010 + 11110111 + 1

A = 00001010 (svarende til decimal 10)

Endelig fik A værdien af ​​B. Således byttetping blev afsluttet.

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

Output:

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

Output:

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

Hvad er aritmetisk overløb?

Udtrykket overflow betyder at overskride grænsen. Aritmetisk overflow betyder, at resultatet af enhver aritmetisk operation overstiger området eller grænsen for computerarkitekturens talrepræsentation. For eksempel, hvis et tal divideres med nul, bliver det uendeligt, og computerens talsystem kan ikke holde det i 32 eller 64 bit.

Heltalsrepræsentation

Heltalsrepræsentation i et 32-bit system

Konsekvensen af ​​det aritmetiske overløb kan være:

  • Additionen af ​​to positive tal bliver negativ, fordi fortegnsbitten kan blive 1, hvilket betyder et negativt tal.
  • Additionen af ​​to negative tal bliver positiv, fordi fortegnsbitten kan blive 0, hvilket betyder et positivt tal.

Ofte Stillede Spørgsmål

XOR-bytteping er interviewfavoritten: ingen ekstra hukommelse, intet overløb. Aritmetik er en rimelig backup, og Python Udviklere skriver normalt bare a, b = b, a.

Nej. Bitvis XOR fungerer kun på heltalsbitmønstre, ikke floats, doubles eller pointere. Brug i stedet tuple-udpakning eller den aritmetiske swap til floats.

Hvis begge variabler deler én hukommelsesplacering, byttes XORping sætter værdien til 0. Tilføj en if-kontrol, når aliasing er mulig.

Ja: a = a * b, b = a / b, a = a / b. Men det fejler, når en af ​​værdierne er 0, og mister float-præcisionen.

Kun tuple-udpakning kan. Hvis man skriver a, b = b, bytter a strenge, lister eller objekter. Aritmetik- og XOR-tricksene er kun heltal.

Knap. Moderne compilere optimerer allerede midlertidige variable swaps, så tricket forbedrer sjældent hastigheden. Readable Kode er vigtigere end at gemme én variabel.

Ja. Maskinlæringskode bytter værdier med Python udpakning af tupler, og nusset Indeksering som arr[[i, j]] = arr[[j, i]] bytter rækker i arrayet om.

Ja. GitHub Copilot og lignende AI-assistenter producerer XOR-, aritmetiske og tuple-udpaknings-swaps fra en prompt. RevSe hver for overflow- og aliasing-fejl.

Opsummer dette indlæg med: