Hoán đổi giá trị 2 biến không cần dùng biến tạm
Table of contents/ Mục lục
Cách 1. Swap 2 số với Cộng và Trừ
Code C++
void swap(int &a, int &b) {
a = a + b;
b = a - b;
a = a - b;
}
Cách này có có vấn đề (giới hạn 1) là nếu a, b quá lớn sẽ gây tràn số.
ví dụ: a = INT_MAX và b = 1000 :D
Cách 2. Swap 2 số với Nhân và Chia
Code C++
void swap(int &a, int &b) {
a = a * b;
b = a / b;
a = a / b;
}
Cách này cũng có giới hạn như cách 1, ngoài ra dễ thấy b phải khác 0, nếu không thì dính Divided by Zero ngay, còn nếu a = 0 thì swap sai vì a*b lúc đó sẽ bằng 0, kết quả swap sẽ luôn là 0,0.
Cách 3. Swap 2 số với XOR và XOR
Code C++
void swap(int &a, int &b) {
a = a ^ b;
b = a ^ b;
a = a ^ b;
}
Cách này có giơi hạn là nếu a và b bằng nhau thì kết quả sẽ là 0 và 0. Nhớ lại 1 chút về phép XOR: 2 thằng giống nhau XOR nhau sẽ cho kết quả là 0.
Xem thêm: https://en.wikipedia.org/wiki/Bitwise_operation#XOR
Ngoài ra, cả 3 cách trên đều có thêm 1 giới hạn nữa, nếu như truyền 2 tham biến có cùng 1 địa chỉ, kết quả sẽ không còn đúng nữa vì phép trừ sẽ trừ đi chính nó cho kết quả là 0, phép chia sẽ chia cho chính nó cho kết quả là 1, phép XOR sẽ XOR cho chính nó và kết quả là 0.
ví dụ, khi gọi swap(a,a) thì
a = a + b; // 2a;
b = a - b; // 0;
a = a - b; // 0;
Để hóa giải được giới hạn sau cùng này, việc đơn giản là phải kiểm tra 2 địa chỉ 2 tham biến trước khi thực hiện swap là OK.
Code C++
void swap(int &a, int &b) {
if (&a == &b) return;
a = a + b;
b = a - b;
a = a - b;
}
CÁCH TỐT NHẤT SWAP 2 SỐ
Tất nhiên dùng phép cộng/trừ theo cách 1 hay nhân/chia theo cách 2 sẽ dính ngay giới hạn về tràn số (cộng, nhân) và divided by zero (chia). Vậy nên cách tốt nhất để swap nên là sử dụng XOR.
Code C++
void swap(int &a, int &b) {
if (&a == &b) return;
a = a ^ b;
b = a ^ b;
a = a ^ b;
}
Have fun!
![]()