[Algorithm] Swap Two Values
Categories: Algoritma, Programming | May 13th, 2008 | by Felix J | 10 Comments3. XOR ! ‘Bits’ Involve
Kita telah membahas 2 dari 3 algoritma untuk menukar nilai ini. dan algoritma ke-3 ini adalah algoritma yang paling cepat dari ke 2 algoritma sebelumnya. untuk diperlu anda ketahui, bahwa algo ini dan algo yang ke-2 hanya berguna untuk bilangan bulat (tipe data integer), jika anda ingin menukar bilangan koma (float) silahkan menggunakan metode pertama diatas…
Apakah anda tahu ttg XoR (eXclusive OR) ini? Jika tidak, maka silahkan tunggu pembahasannya dipost berikutnya
untuk sementara, silahkan nikmatilah *mengertiin* kode yang terpampang dibawah ini
silahkan langsung dilihat kodenya: *example code taken from http://www.comp.nus.edu.sg/~stevenha/ , Credits to him :)*
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | #include <stdio.h> void swap(int *a,int *b) { // initially a = 000111 ( 7) and b = 110001 (49) *a ^= *b; // a = 110110 (54) and b = 110001 (49) *b ^= *a; // a = 110110 (54) and b = 000111 ( 7) *a ^= *b; // a = 110001 (49) and b = 000111 ( 7) } void main() { int num1 = 7,num2 = 49; printf("%d %d\n",num1,num2); swap(&num1,&num2); printf("%d %d\n",num1,num2); } |
*I didn’t Modified That code above, just like the original one written in that site.*
Kode diatas, dapat di modifikasi untuk memudahkan dan mengefisienkan waktu penulisan menjadi
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | void swap(int &a, int &b) { a ^= b ^= a ^= b; // Kode diatas adalah pengsimpelan dari kode // a ^= b; // b ^= a; // a ^= b; } void main() { int a = 5, b = 7; swap (a,b); } |
*Kode diatas, adalah sesuai masukan dari Bp. Suhendry. Sehingga untuk pemudahan pemakaian fungsi, saya merubah kode fungsi2 tersebut menjadi alias saja. :)*
Akhir kata, semoga artikel ini bermanfaat bagi kalian semua sehingga yang sebelumnya tidak mengerti menjadi mengerti, dan yang sudah mengerti tambah mengerti.
- Felix J
passing parameter fungsinya bisa pake alias:
void swap(int &a, int &b) {
a ^= b;
b ^= a;
a ^= b;
// code di atas bisa juga disingkat jadi:
// a ^= b ^= a ^= b;
}
void main() {
int a = 5, b = 7;
swap(a, b);
}
anyway, good article
wah wahhh… ada om shu disini…
Ok dhe.. tar ku update ini articlenya
ditambahin dengan tambahan dari om shu
Thx masukannya Om…
hehehehe..
Challenge untuk cara ke-2 (yang nge swap pake + -):
void swap(int &a, int &b){
a += b;
b = a - b;
a -= b;
}
int main() {
int a = 1000000000;
int b = 2000000000;
printf(”Sebelum: a = %d, b = %d\n”, a,b);
swap(a,b);
printf(”Sesudah: a = %d, b = %d\n”, a,b); // hasilnya berapa?
}
Wah wah… kalo untuk GCC (32 bit compiler), sih fungsi tersebut jalan, tapi mungkin untuk 16 bit compiler, keknya ada error dhee…
Bner gk kk?
Oh haha.. gak jadi deh… kirain bisa overflow di 32 bit. Algo diatas bener untuk 32 bit maupun 16 bit kalau a dan b tidak overflow sebelum di swap.
yupp… tapi sih algo yang tambah kurang itu, kalo di coba untuk a misalkan 3 miliar dan b juga 3 miliar, tentunya sih error… karena lebih dari 2^(32-1) (2.147.483.648)
ok, aku tambahkan
Thx kk Felix untuk ngingetin ttg overflownya…
wa,,,,ternyata ko felix sudah post juga n lebih lengkap lagi.
blognya kog ada 2. yang aktif yang mana ni?
yang blog-sally itu punya pacarku
ini punyaku sendiri… ohh.. jangan panggil saya ‘ko’.. felix aja ato felix j jg boleh… *kalo felix doang ketuker ma felix halim
*
baru juga lulus SMA, dah di panggil ‘ko’ haduh… tua skali aku T_T
btw, thx dah kunjungin blog kuw.. smoga makin nambah ilmu… hehehe…
sorry ni. gq kirain felix halim. makanya gw panggil ko. iya d, gw panggil felix. heeee,,,,,
wahahhaha…. as i thought
beda orang kk… walau emang aku dan felix halim itu dekat dan saling kenal.. tapi ttp aja beda orang… hehehhe… dia itu yang ngajarin aku algo sampe lebih dalem…. 
kalo yang ini Felix J… makanya tiap post pasti ku cantumin “J” biar gk kesandung ma “Felix H” :))
felix halim tuh dia cman ada 1 kok url nya… felix-halim.net