ปัญหา
มีตัวแปร a ที่มีค่าเป็น x หรือ y ต้องการเปลี่ยนค่า a ให้เป็นอีกค่าหนึ่ง (ถ้า a==x ให้กลายเป็น y, ถ้า a==y ให้กลายเป็น x) ห้ามใช้เงื่อนไข if/else หรือ ternary operator
วิธีที่ 1: ใช้คณิตศาสตร์ (บวก-ลบ)
สูตร: a = x + y - a
- ถ้า a = x: a = x + y - x = y ✓
- ถ้า a = y: a = x + y - y = x ✓
#include <iostream>
using namespace std;
int main() {
int x = 45, y = 5;
int a = x; // เริ่มต้น a = x
cout << "Initial a: " << a << endl;
a = x + y - a; // สลับค่า
cout << "After swap: " << a << endl;
return 0;
}
ผลลัพธ์: 45 → 5
วิธีที่ 2: ใช้ Bitwise XOR
สูตร: a = x ^ y ^ a
คุณสมบัติ XOR: a ^ a = 0, a ^ 0 = a, สลับที่ได้
- ถ้า a = x: a = x ^ y ^ x = (x ^ x) ^ y = 0 ^ y = y ✓
- ถ้า a = y: a = x ^ y ^ y = x ^ (y ^ y) = x ^ 0 = x ✓
#include <iostream>
using namespace std;
int main() {
int x = 56, y = 78;
int a = x;
cout << "Initial a: " << a << endl;
a = x ^ y ^ a;
cout << "After swap: " << a << endl;
return 0;
}
ผลลัพธ์: 56 → 78
เปรียบเทียบ
| วิธี | ข้อดี | ข้อเสีย |
|---|---|---|
| บวก-ลบ | เข้าใจง่าย, ใช้ได้กับ float | อาจเกิด overflow ด้วย int ใหญ่ |
| XOR | ไม่มี overflow, เร็วกว่า, ใช้ได้กับ pointer | ใช้ได้กับ integer เท่านั้น |
โน้ต
ทั้งสองวิธีทำงานได้ก็ต่อเมื่อ a มีค่าเป็น x หรือ y เท่านั้น หาก a มีค่าอื่น ผลลัพธ์จะไม่ถูกต้อง