สามารถสลับค่าตัวแปรสองตัวได้โดยไม่ต้องใช้ตัวแปรชั่วคราว (temporary variable) ด้วยเทคนิคทางคณิตศาสตร์หรือ Bitwise XOR
วิธีที่ 1: ใช้คณิตศาสตร์ (Arithmetic Method)
a += b -= a = b - a;
การทำงานทีละขั้นตอน
สมมติ a = 23, b = 43
1. a = b - a → a = 43 - 23 = 20
2. b -= a → b = 43 - 20 = 23
3. a += b → a = 20 + 23 = 43
ผลลัพธ์: a = 43, b = 23 ✓
วิธีที่ 2: ใช้ Bitwise XOR (XOR Swap Algorithm)
(a ^= b), (b ^= a), (a ^= b);
การทำงานทีละขั้นตอน
สมมติ a = 28 (11100), b = 8 (01000)
1. a ^= b → a = 11100 ^ 01000 = 10100 (20)
2. b ^= a → b = 01000 ^ 10100 = 11100 (28)
3. a ^= b → a = 10100 ^ 11100 = 01000 (8)
ผลลัพธ์: a = 8, b = 28 ✓
ตัวอย่างโปรแกรมครบ
#include <stdio.h>
int main() {
int a = 28, b = 8;
printf("Before Swapping : %d\t%d\n", a, b);
// Method 1: Arithmetic
a += b -= a = b - a;
printf("After Method 1 : %d\t%d\n", a, b);
// Method 2: XOR
(a ^= b), (b ^= a), (a ^= b);
printf("After Method 2 : %d\t%d\n", a, b);
return 0;
}
ผลลัพธ์
Before Swapping : 28 8
After Method 1 : 8 28
After Method 2 : 28 8
ข้อควรระวัง (Caveats)
- Arithmetic Method: อาจเกิด Integer Overflow หากผลรวมเกินขอบเขตของชนิดข้อมูล
- XOR Method: ใช้ได้กับ Integer types เท่านั้น ไม่ได้กับ Float/Double
- Aliasing Problem: หาก
aและbชี้ไปที่หน่วยความจำเดียวกัน (same address) XOR method จะทำให้ค่ากลายเป็น 0 - Readability: โค้ดยากต่อการอ่าน เข้าใจ และบำรุงรักษา
แนวทางปฏิบัติที่แนะนำ
// ใช้ตัวแปรชั่วคราว - ชัดเจน เร็ว และปลอดภัย
int temp = a;
a = b;
b = temp;
// หรือใน C++ ใช้ std::swap
#include <algorithm>
std::swap(a, b);
สรุป: เทคนิคนี้เหมาะสำหรับการสอบ/สัมภาษณ์หรือ embedded systems ที่ memory จำกัดมาก แต่ในการพัฒนาจริง ควรใช้ std::swap หรือตัวแปรชั่วคราวเพื่อความชัดเจนและปลอดภัย