Mari kita lihat contoh c sederhana untuk menukar dua angka tanpa menggunakan variabel ketiga.
program 1:
#include<stdio.h>
#include<conio.h>
main()
{
int a=10, b=20;
clrscr();
printf("Before swap a=%d b=%d",a,b);
a=a+b;//a=30 (10+20)
b=a-b;//b=10 (30-20)
a=a-b;//a=20 (30-10)
printf("\nAfter swap a=%d b=%d",a,b);
getch();
}
Keluaran:
Sebelum pertukaran a = 10 b = 20 Setelah pertukaran a = 20 b = 10
Program 2: Menggunakan * dan /
Mari kita lihat contoh lain untuk menukar dua angka menggunakan * dan /.
#include<stdio.h>
#include<conio.h>
main()
{
int a=10, b=20;
clrscr();
printf("Before swap a=%d b=%d",a,b);
a=a*b;//a=200 (10*20)
b=a/b;//b=10 (200/20)
a=a/b;//a=20 (200/10)
printf("\nAfter swap a=%d b=%d",a,b);
getch();
}
Keluaran:
Sebelum pertukaran a = 10 b = 20 Setelah pertukaran a = 20 b = 10
Program 3: Memanfaatkan operator XOR bitwise:
Operator bitwise XOR dapat digunakan untuk menukar dua variabel. XOR dari dua bilangan x dan y mengembalikan bilangan yang memiliki semua bit sebagai 1 di mana bit x dan y berbeda. Misalnya, XOR dari 10 (Dalam Biner 1010) dan 5 (Dalam Biner 0101) adalah 1111 dan XOR dari 7 (0111) dan 5 (0101) adalah (0010).
#include <stdio.h>
int main()
{
int x = 10, y = 5;
// Code to swap 'x' (1010) and 'y' (0101)
x = x ^ y; // x now becomes 15 (1111)
y = x ^ y; // y becomes 10 (1010)
x = x ^ y; // x becomes 5 (0101)
printf("After Swapping: x = %d, y = %d", x, y);
return 0;
Keluaran:
Setelah Penukaran: x = 5, y = 10
Program 4:
Belum ada yang menyarankan menggunakan std :: swap.
std::swap(a, b);
Saya tidak menggunakan variabel sementara apa pun dan bergantung pada jenis a dan b, implementasinya mungkin memiliki spesialisasi yang juga tidak. Implementasinya harus ditulis dengan mengetahui apakah 'trik' itu sesuai atau tidak.
Masalah dengan metode di atas:
1) Pendekatan berbasis perkalian dan pembagian tidak akan berhasil jika salah satu bilangan adalah 0 karena hasil kali menjadi 0 terlepas dari bilangan lainnya.
2) Kedua solusi Aritmatika dapat menyebabkan luapan aritmatika. Jika x dan y terlalu besar, penjumlahan dan perkalian mungkin keluar dari kisaran bilangan bulat.
3) Saat kita menggunakan pointer ke variabel dan melakukan pertukaran fungsi, semua metode di atas gagal ketika kedua pointer menunjuk ke variabel yang sama. Mari kita lihat apa yang akan terjadi dalam kasus ini jika keduanya menunjuk ke variabel yang sama.
// Metode berbasis Bitwise XOR
x = x ^ x; // x becomes 0
x = x ^ x; // x remains 0
x = x ^ x; // x remains 0
// Metode berbasis aritmatika
x = x + x; // x becomes 2x
x = x – x; // x becomes 0
x = x – x; // x remains 0
Yuk kita simak programnya berikut ini.
#include <stdio.h>
void swap(int *xp, int *yp)
{
*xp = *xp ^ *yp;
*yp = *xp ^ *yp;
*xp = *xp ^ *yp;
}
int main()
{
int x = 10;
swap(&x, &x);
printf("After swap(&x, &x): x = %d", x);
return 0;
}
Keluaran :
Setelah penukaran (& x, & x): x = 0
Menukar variabel dengan dirinya sendiri mungkin diperlukan di banyak algoritme standar. Misalnya, lihat implementasi QuickSort ini di mana kita dapat menukar variabel dengan dirinya sendiri. Masalah di atas dapat dihindari dengan menempatkan kondisi sebelum melakukan swapping.
#include <stdio.h>
void swap(int *xp, int *yp)
{
if (xp == yp) // Check if the two addresses are same
return;
*xp = *xp + *yp;
*yp = *xp - *yp;
*xp = *xp - *yp;
}
int main()
{
int x = 10;
swap(&x, &x);
printf("After swap(&x, &x): x = %d", x);
return 0;
}
Keluaran :
Setelah pertukaran (& x, & x): x = 10