Python Program for å bytte om to tall uten å bruke den tredje variabelen

⚡ Smart oppsummering

Byttping To tall uten en tredje variabel bytter verdier ved hjelp av aritmetisk addisjon og subtraksjontracsjon, den bitvise XOR-operatoren eller bitvis-aritmetiske triks. Python kan også bytte direkte med tuple-utpakking.

  • 🔘 Klassisk metode: Den vanlige byttefunksjonen holder én verdi i en midlertidig variabel, noe disse teknikkene unngår.
  • Aritmetisk bytte: Bytt verdier med a = a + b, deretter b = a − b, og deretter a = a − b.
  • 🔀 XOR-bytte: Bruk den bitvise XOR-operatoren tre ganger for å bytte heltall uten overflyt.
  • 🧮 Bitvis aritmetikk: Bruk AND-, OR- og komplementoperatorene for å gjengi addisjon og subtracsjon.
  • 🐍 Python snarvei: Tupleutpakking, a, b = b, a, bytter om to verdier på én linje.
  • 🤖 AI og data: Tuple-bytter og NumPy-indeksering omorganiserer array-elementer i forberedelse til maskinlæring.

Bytt to Numbers Uten å bruke en tredje variabel

Avsnittene nedenfor dekker fire måter å bytte uten en midlertidig variabel, pluss aritmetisk overløp.

I programmeringsspråk, swapping betyr å bytte verdiene til to variabler. Variabelen kan inneholde et tall, en streng, en liste eller en matrise, et objekt osv. Den generelle måten å bytte påping er å bruke en midlertidig variabel til å holde verdier. For eksempel,

Bytt to Numbers

De generelle trinnene for bytteping to tall er:

  • Deklarer en midlertidig variabel C
  • Tilordne verdien av A til C, som betyr C = A. Nå er C = 20
  • Tilordne verdien av B til A, så A = 30
  • Tilordne verdien av C til B, så B = 20, ettersom C har verdien 20.

Slik bytter duping gjøres ved hjelp av en midlertidig variabel, og den fungerer for både heltall og flyttall.

Bytt med aritmetisk ligning

Som vi vet, bytteping betyr å bytte om innholdet i to objekter, felt eller variabler. Å bytte ved hjelp av en aritmetisk operasjon betyr å utføre byttet ved hjelp av en matematisk ligning, f.eks. addisjon og subtraksjon.tracsjon.

Hvis vi får to tall og blir bedt om å bytte uten å bruke en midlertidig variabel, kan vi bytte tallene ved å bruke tre aritmetiske ligninger.

Pseudokode for bytteping tall ved hjelp av en aritmetisk operasjon:

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

La oss anta at vi har to tall, A = 20 og B = 30.

Tilstand 1: A = A+B

Så den nåværende verdien av A er 20 + 30 = 50

Tilstand 2: B = AB

Nå er B = 50-30 = 20
Vi kan se at vi har verdien av A i B.

Tilstand 3: A = AB

Til slutt, A = 50-20 = 30
A har startverdien til B.

Så vi byttet bare tallene.

Her er programmet for å bytte om to tall 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);
}

Utgang:

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

Utgang:

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

Nå i Python, trenger vi ikke engang å utføre aritmetiske operasjoner. Vi kan bruke:

a,b = b,a

Her er en demonstrasjon der a=20, b=30;

Bytt med aritmetisk ligning

Bytt med Bitwise XOR Operator

Denne metoden er også kjent som XOR-swap. XOR betyr eksklusiv ELLER. Vi tar to bits som innganger til XOR i denne bitvise operasjonen. For å få én utgang fra XOR, må bare én inngang være 1. Ellers vil utgangen være 0. Tabellen nedenfor viser utgangen for alle kombinasjoner av inngang A og B.

Vi må vite hvordan XOR-operasjonen fungerer for å bytte om to tall ved hjelp av den bitvise operasjonen. Her er en tabell for XOR hvor A og B er inngangsverdiene.

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

Hvis to innganger har samme verdi, gir XOR-operasjonen 0; ellers 1. I dette eksemplet bruker vi en 3 XOR-operasjon. I de fleste programmeringsspråk er XOR betegnet som «^».

La oss anta A=4 (i binær = 0100) og B=7 (i binær, 0111)

Tilstand 1: A = A ^ B

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

Nå, A = 0011 (i binær).

Tilstand 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 første binære verdien av A.

Tilstand 3: A = A^B

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

Til slutt, A = 0111, som var den ekvivalente binære verdien 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);
}

Utgang:

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

Utgang:

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

Bytt Numbers ved hjelp av Bitwise-Aritmetic

Denne metoden er den samme som den aritmetiske metoden, men vi bruker bitvise operasjoner som OG, ELLER og komplement for å utføre addisjon og subtraksjontracFør vi går videre til trinnene, la oss raskt se på «komplement».

1-komplement betyr å endre alle 0 til 1 og 1 til 0. La oss ta et eksempel.

  • La oss anta tallet 23, et desimaltall.
  • Konvertering til binært tall gir oss 10111. Det er bare 5 bit, men datamaskinen lagrer tall i 8, 16, 32, 64 … bit. Så la oss legge til null foran det binære tallet. Det vil ikke endre den opprinnelige verdien av tallet. Så det vil bli 00010111.
  • Som vi vet, betyr 1-komplement å endre alle 0-ene til 1 og 1 til 0, så å utføre 1-komplementet over 00010111 gir 11101000.

Dette enerkomplementet er representert med symbolet «~» i de fleste programmeringsspråk. Hvis du setter dette symbolet foran heltallsverdier eller flyttallsverdier, får du enerkomplementet.

Og 2-komplement betyr å legge til binær "1" til 1-komplementet. Hvis vi gjør 2-er komplement til tallet ovenfor:

  • Binær = 00010111
  • 1-komplement = 11101000
  • 2-komplementet:

11101000

+ 1

11101001

Så 2s komplement er 11101001. Dette er binæren for -23.
Oppsummert, for å utføre 2s komplement av et tall A, vil det se slik ut:

2s komplement av A = (~A) + 1

La oss nå anta A=8 (binær 00001000), B=10 (00001010)

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

Det tilsvarer A = A + B.

A & B = 00001000 og 00001010 = 00001000

A | B = 00001000 | 00001010 = 00001010

Nå, 00001000 + 00001010 = 00010010 (desimal 18)

Så A = 18

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

Det tilsvarer B = AB

Her er B = A – B

Ut fra diskusjonen ovenfor, hvis vi trenger å utføre subtracI denne stillingen utfører vi 2-komplementet til det negative tallet og legger det deretter til.

Så -B = ~B + 1

Nå er B = 00010010 + (11110101) + 1 = 00001000

Bs verdi tilsvarer desimal 8, som var startverdien.

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

Det tilsvarer A = AB

Nå er A = 00010010 + 11110111 + 1

A = 00001010 (tilsvarer desimal 10)

Til slutt fikk A verdien av B. Dermed ble byttetping var fullført.

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

Utgang:

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

Utgang:

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

Hva er aritmetisk overløp?

Begrepet overløp betyr å overskride grensen. Aritmetisk overløp betyr at resultatet av enhver aritmetisk operasjon overskrider området eller grensen for dataarkitekturens tallrepresentasjon. Hvis for eksempel et tall deles på null, blir det uendelig, og datamaskinens tallsystem kan ikke holde det i 32 eller 64 bits.

Heltallsrepresentasjon

Heltallsrepresentasjon i et 32-bits system

Konsekvensen av det aritmetiske overløpet kan være:

  • Addisjonen av to positive tall blir negativ, fordi fortegnsbiten kan bli 1, som betyr et negativt tall.
  • Addisjonen av to negative tall blir positiv, fordi fortegnsbiten kan bli 0, som betyr et positivt tall.

Spørsmål og svar

XOR-bytteping er intervjufavoritten: ingen ekstra minne, ingen overløp. Aritmetikk er en god backup, og Python utviklere skriver vanligvis bare a, b = b, a.

Nei. Bitvis XOR fungerer bare på heltallsbitmønstre, ikke flyttall, dobling eller pekere. For flyttall, bruk tuple-utpakking eller aritmetisk swap i stedet.

Hvis begge variablene deler én minneplassering, byttes XORping setter verdien til 0. Legg til en if-sjekk når aliasing er mulig.

Ja: a = a * b, b = a / b, a = a / b. Men det mislykkes når en av verdiene er 0 og mister flyttalspresisjonen.

Bare tupleutpakking kan. Når a, b = b skrives, bytter a strenger, lister eller objekter. Aritmetiske og XOR-triksene er kun heltallsbaserte.

Knapt. Moderne kompilatorer optimaliserer allerede midlertidige variable bytter, så trikset forbedrer sjelden hastigheten. Readable Kode er viktigere enn å lagre én variabel.

Ja. Maskinlæringskode bytter verdier med Python tupleutpakking, og nusset Indeksering som arr[[i, j]] = arr[[j, i]] bytter rader i arrayet.

Ja. GitHub Copilot og lignende AI-assistenter produserer XOR-, aritmetiske og tuple-utpakkingsbytter fra en ledetekst. RevSe hver for overløps- og aliasing-feil.

Oppsummer dette innlegget med: